我不明白委托构造函数的用途是什么。简单地说,没有委托构造函数就不能实现什么?
它可以像这样做一些简单的事情
class M
{
int x, y;
char *p;
public:
M(int v) : x(v), y(0), p(new char [MAX]) {}
M(): M(0) {cout<<"delegating ctor"<<endl;}
};
但我不认为为这么简单的事情引入一个新功能是值得的?也许我没有意识到重点所在。有什么想法吗?
发布于 2014-10-08 04:44:22
委托构造函数的一个关键用途是获得额外的模板参数包,特别是指定成员初始化器所需的整数索引序列:
例如:
struct constant_t;
template <class T, size_t N>
struct Array {
T data[N];
template <size_t... Is>
constexpr Array(constant_t, T const &value, std::index_sequence<Is...>)
: data { (Is,value)... }
{}
constexpr Array(constant_t, T const &value)
: Array(constant_t{}, value, std::make_index_sequence<N>{})
{}
};
通过这种方式,我们可以定义一个构造函数,该构造函数将数组初始化为常量值,而无需首先默认初始化每个元素。据我所知,实现这一点的另一种方法是将数据成员粘贴到基类中。
当然,对模板参数包的更好的语言支持可能会使这一点变得不必要。
发布于 2014-10-10 21:00:09
我描述了Overload #113中委托构造函数的另一种用法,它简化了Cassio Neri的Complex Logic in the Member Initialiser List中重载#112中描述的解决方案。
与函数体中的代码不同,在编写构造函数的成员初始值设定项时,不能创建局部变量来存储多个成员所需的中间结果。
考虑如下的构造函数:
double some_expensive_calculation(double d);
bar::bar(double d)
: x_(cos(some_expensive_calculation(d))), y_(sin(some_expensive_calculation(d)))
{ }
我们希望避免执行两次昂贵的计算(在Cassio描述的原始问题的上下文中,基类也想要计算的结果,因此您不能在构造函数体中简单地分配给x_
和y_
)。
我描述的技巧是计算中间结果并委托给使用该结果的另一个构造函数:
class bar {
struct tag { };
...
bar(double result, tag);
public:
bar(double d);
};
bar::bar(double d)
: bar(some_expensive_calculation(d), tag{})
{ }
bar::bar(double result, tag)
: x_(cos(result)), y_(sin(result))
{ }
发布于 2014-10-11 21:05:16
在我看来,值得一提的是,偶尔有人建议,可以通过将公共代码重构为私有init-function来减轻多个构造函数之间的代码重复。这样做的问题是,如果类有朋友,这些朋友可以多次调用init -它不应该被多次调用。委托构造函数可以防止此类问题,因为构造函数不能在对象初始化后运行。
https://stackoverflow.com/questions/26199431
复制相似问题