如何声明委托构造函数?非C++11版本实现方法咨询
委托构造函数的声明与非C++11替代方案
一、C++11中声明委托构造函数
在C++11里,委托构造函数允许同一个类的构造函数直接调用本类的其他构造函数,写法是在构造函数的初始化列表位置调用目标构造函数,不用再自行初始化成员变量。
实际示例代码:
#include <string> class MyClass { private: int a; std::string b; public: // 基础构造函数,负责初始化所有成员 MyClass(int num, const std::string& str) : a(num), b(str) {} // 委托构造函数:调用基础构造函数,给b传默认值 MyClass(int num) : MyClass(num, "default") {} // 另一个委托构造函数:调用基础构造函数,给a和b都传默认值 MyClass() : MyClass(0, "default") {} };
注意:委托构造函数不能在初始化列表里同时初始化成员变量,必须完全委托给其他构造函数。
二、非C++11版本的替代实现
C++11之前不支持构造函数互相委托,常用两种方法实现类似效果:
方法1:提取初始化逻辑到私有成员函数
把多个构造函数重复的初始化代码抽成一个私有函数,所有构造函数都调用这个函数完成初始化。示例:
#include <string> class MyClass { private: int a; std::string b; // 封装初始化逻辑的私有函数 void init(int num, const std::string& str) { a = num; b = str; } public: MyClass(int num, const std::string& str) { init(num, str); } MyClass(int num) { init(num, "default"); } MyClass() { init(0, "default"); } };
这种方法有局限:如果成员是const或者引用类型,没法在构造函数体里初始化(必须在初始化列表),这时可以用下面的方法。
方法2:使用构造函数默认参数
给基础构造函数的参数设置默认值,一个构造函数就能覆盖多个场景,模拟委托效果。示例:
#include <string> class MyClass { private: const int a; const std::string& b; public: // 通过默认参数,一个构造函数实现多场景初始化 MyClass(int num = 0, const std::string& str = "default") : a(num), b(str) {} };
这种方式适合参数不多、默认值明确的情况,代码更简洁。
内容的提问来源于stack exchange,提问作者Dragon Iron
相关产品推荐
相关产品推荐

