首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么C++11引入了委托构造函数?

为什么C++11引入了委托构造函数?
EN

Stack Overflow用户
提问于 2014-10-05 11:44:45
回答 3查看 15.1K关注 0票数 24

我不明白委托构造函数的用途是什么。简单地说,没有委托构造函数就不能实现什么?

它可以像这样做一些简单的事情

代码语言:javascript
复制
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;}
};

但我不认为为这么简单的事情引入一个新功能是值得的?也许我没有意识到重点所在。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2014-10-08 04:44:22

委托构造函数的一个关键用途是获得额外的模板参数包,特别是指定成员初始化器所需的整数索引序列:

例如:

代码语言:javascript
复制
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>{})
    {}
};

通过这种方式,我们可以定义一个构造函数,该构造函数将数组初始化为常量值,而无需首先默认初始化每个元素。据我所知,实现这一点的另一种方法是将数据成员粘贴到基类中。

当然,对模板参数包的更好的语言支持可能会使这一点变得不必要。

票数 6
EN

Stack Overflow用户

发布于 2014-10-10 21:00:09

我描述了Overload #113中委托构造函数的另一种用法,它简化了Cassio Neri的Complex Logic in the Member Initialiser List中重载#112中描述的解决方案。

与函数体中的代码不同,在编写构造函数的成员初始值设定项时,不能创建局部变量来存储多个成员所需的中间结果。

考虑如下的构造函数:

代码语言:javascript
复制
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_ )。

我描述的技巧是计算中间结果并委托给使用该结果的另一个构造函数:

代码语言:javascript
复制
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))
{ }
票数 2
EN

Stack Overflow用户

发布于 2014-10-11 21:05:16

在我看来,值得一提的是,偶尔有人建议,可以通过将公共代码重构为私有init-function来减轻多个构造函数之间的代码重复。这样做的问题是,如果类有朋友,这些朋友可以多次调用init -它不应该被多次调用。委托构造函数可以防止此类问题,因为构造函数不能在对象初始化后运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26199431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档