使用类内成员初始化委派构造函数
Delegating Constructors with In-Class Member Initialization
我想做以下事情:
class DelegatingCTorPlusInClass
{
public:
DelegatingCTorPlusInClass()
:
DelegatingCTorPlusInClass(m_a, m_b) // m_a and m_b are "random"
{
};
DelegatingCTorPlusInClass(int a)
:
DelegatingCTorPlusInClass(a, m_b) // m_b is "random"
{
};
DelegatingCTorPlusInClass(const std::string &b)
:
DelegatingCTorPlusInClass(m_a, b) // m_a is "random"
{
};
DelegatingCTorPlusInClass(int a, const std::string &b)
:
m_a(a),
m_b(b)
{
// DO THINGS
};
private:
int m_a = 42;
std::string m_b = "42";
};
然而,从一个构造函数传递到另一个构造函数的成员尚未初始化,因此基本上是"随机"的。那我怎么能取得类似的成绩呢
[class.base.init]/9
:
如果给定的非静态数据成员同时具有大括号或相等初始值设定项和mem初始值设定项,则执行mem初始值设置项括号或相等初始化项。
这证明了在主构造函数中使用垃圾分配成员是合理的:
DelegatingCTorPlusInClass(int a, const std::string &b)
:
m_a(a), // this is mem-initializer for m_a, so m_a = 42 is ignored and you are getting garbage
m_b(b) // the same for m_b
{
};
为了避免默认值的重复,您可以为它们使用常量,这样您就可以使用以下内容:
DelegatingCTorPlusInClass() : DelegatingCTorPlusInClass(m_a_default, m_b_default)
{
};
您希望从具有较少参数的构造函数中构建默认值,而不是依赖于内联初始化。
class DelegatingCTorPlusInClass
{
public:
DelegatingCTorPlusInClass()
:
DelegatingCTorPlusInClass(42, "42") // default values
{
};
DelegatingCTorPlusInClass(int a)
:
DelegatingCTorPlusInClass(a, "42")
{
};
DelegatingCTorPlusInClass(const std::string &b)
:
DelegatingCTorPlusInClass(42, b)
{
};
DelegatingCTorPlusInClass(int a, const std::string &b)
:
m_a(a),
m_b(b)
{
// DO THINGS
};
private:
int m_a;
std::string m_b;
};
构造函数应该定义该用法的值要求。只有当内联初始化对所有构造函数都为true时,它才有意义。
不需要仅仅因为存在非静态数据成员初始化器和委托构造函数就使用它们。有什么问题
class DelegatingCTorPlusInClass
{
public:
DelegatingCTorPlusInClass(int a = 42, std::string b = "42")
: m_a(a), m_b(std::move(b))
{
// DO THINGS
}
private:
int m_a;
std::string m_b;
};
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 委派复制构造函数和常量数据初始化
- 模板类 + 委派构造函数 = 字段未初始化?(叮叮当当整)
- C++使用初始化列表委派构造函数.哪个初始化发生
- 使用类内成员初始化委派构造函数