题目
编写程序,演示 C++11 引入的“就地非静态成员默认初始化”(In-class member initializers)与“委托构造函数”(Delegating Constructor)。设计网络请求类 HttpRequest,将多个重载构造函数的公共参数校验与初始化逻辑委托给一个主目标构造函数(Target Constructor),彻底消灭多重载构造函数间的代码重复;并演示就地初始化值被构造列表覆写的先后顺序规则。
输入格式:无需外部输入。
输出格式:输出不同参数的委托构造调用路径与最终实例各字段值。
数据范围与约定:C++11 现代构造机制、初始化优先级与防循环委托。
思路与算法
1. 解决 C++03 冗余辅助函数问题
在 C++11 之前,为了避免在 5 个构造函数中复制粘贴相同的初始化代码,开发者常写一个 init() 私有函数。但这无法初始化 const 成员与引用成员。委托构造函数彻底解决了这一困境。
2. 语法唯一性约束
当一个构造函数委托给另一个构造函数时,其初始化列表内有且仅能包含被委托的目标构造函数,不能同时再初始化其他成员(如 Foo() : Foo(1), x_(2) 属于编译语法错误)。
3. 防循环委托
若 A() : B() 且 B() : A(),会导致死递归,现代编译器能够检测出此类静态循环委托并报错。
完整程序
#include <iostream>
#include <string>
class HttpRequest {
private:
// C++11 类内就地默认初始化
std::string method_{"GET"};
std::string url_{"http://localhost:80"};
int timeoutMs_{3000};
bool keepAlive_{true};
public:
// 目标主构造函数:包含最完整的逻辑
HttpRequest(std::string method, std::string url, int timeoutMs, bool keepAlive)
: method_(std::move(method)), url_(std::move(url)),
timeoutMs_(timeoutMs), keepAlive_(keepAlive) {
std::cout << " [主构造函数执行完毕] URL: " << url_ << "\n";
}
// 委托构造 1:仅传 URL,其余走默认设置
explicit HttpRequest(std::string url)
: HttpRequest("GET", std::move(url), 3000, true) {
std::cout << " [委托构造 1] 默认 GET 模板生效\n";
}
// 委托构造 2:指定 method 与 URL
HttpRequest(std::string method, std::string url)
: HttpRequest(std::move(method), std::move(url), 5000, true) {
std::cout << " [委托构造 2] 自定义谓词模板生效\n";
}
void dump() const {
std::cout << "请求概要: " << method_ << " " << url_
<< " [超时: " << timeoutMs_ << "ms, 长连接: "
<< (keepAlive_ ? "开启" : "关闭") << "]\n\n";
}
};
int main() {
std::cout << "--- 1. 调用单参委托构造 ---\n";
HttpRequest req1("https://api.github.com/events");
req1.dump();
std::cout << "--- 2. 调用双参委托构造 ---\n";
HttpRequest req2("POST", "https://api.github.com/repos/create");
req2.dump();
return 0;
}运行示例
输出:
--- 1. 调用单参委托构造 ---
[主构造函数执行完毕] URL: https://api.github.com/events
[委托构造 1] 默认 GET 模板生效
请求概要: GET https://api.github.com/events [超时: 3000ms, 长连接: 开启]
--- 2. 调用双参委托构造 ---
[主构造函数执行完毕] URL: https://api.github.com/repos/create
[委托构造 2] 自定义谓词模板生效
请求概要: POST https://api.github.com/repos/create [超时: 5000ms, 长连接: 开启]