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

Nayana adassuriya

我不明白委派构造函数的用处。简而言之,如果没有委托的构造函数是无法实现的?

它可以做一些简单的事情

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;}
};

但是我不认为有必要为这么简单的事情引入新功能吗?可能是我无法理解重点。任何的想法?

量子开发

委派构造函数可防止代码重复(以及随之而来的所有可能的错误和缺陷:增加维护,降低可读性...),这是一件好事。

这也是委派初始化列表(针对成员和基础初始化)的唯一方法,即,您真的不能通过Init()为构造函数使用共享方法来替换此功能


例子:

1)N1986提案中的常见初始化

class X { 
 X( int, W& ); 
 Y y_; 
 Z z_; 
public: 
 X(); 
 X( int ); 
 X( W& ); 
}; 
X::X( int i, W& e ) : y_(i), z_(e) { /*Common Init*/ } 
X::X() : X( 42, 3.14 )             { SomePostInitialization(); } 
X::X( int i ) : X( i, 3.14 )       { OtherPostInitialization(); } 
X::X( W& w ) : X( 53, w )          { /* no post-init */ } 

2)同时具有构造函数和复制构造函数的委派,也来自N1986提案

class FullName { 
 string firstName_; 
 string middleName_; 
 string lastName_; 

public: 
 FullName(string firstName, string middleName, string lastName); 
 FullName(string firstName, string lastName); 
 FullName(const FullName& name); 
}; 
FullName::FullName(string firstName, string middleName, string lastName) 
 : firstName_(firstName), middleName_(middleName), lastName_(lastName) 
{ 
 // ... 
} 
// delegating copy constructor 
FullName::FullName(const FullName& name) 
 : FullName(name.firstName_, name.middleName_, name.lastName_) 
{ 
 // ... 
} 
// delegating constructor 
FullName::FullName(string firstName, string lastName) 
 : FullName(firstName, "", lastName) 
{ 
 // ... 
} 

3) MSDN给出了此示例,其中构造函数执行参数验证(如前所述,该设计值得商)):

class class_c {
public:
    int max;
    int min;
    int middle;

    class_c() {}
    class_c(int my_max) { 
        max = my_max > 0 ? my_max : 10; 
    }
    class_c(int my_max, int my_min) { 
        max = my_max > 0 ? my_max : 10;
        min = my_min > 0 && my_min < max ? my_min : 1;
    }
    class_c(int my_max, int my_min, int my_middle) {
        max = my_max > 0 ? my_max : 10;
        min = my_min > 0 && my_min < max ? my_min : 1;
        middle = my_middle < max && my_middle > min ? my_middle : 5;
    }
};

多亏了构造函数的委托,它简化为:

class class_c {
public:
    int max;
    int min;
    int middle;

    class_c(int my_max) { 
        max = my_max > 0 ? my_max : 10; 
    }
    class_c(int my_max, int my_min) : class_c(my_max) { 
        min = my_min > 0 && my_min < max ? my_min : 1;
    }
    class_c(int my_max, int my_min, int my_middle) : class_c (my_max, my_min){
        middle = my_middle < max && my_middle > min ? my_middle : 5;
}
};

链接:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ 11引入了带有`const char *`的异常构造函数。但为什么?

为什么Java 9引入了JMOD文件格式?

为什么C ++ 20中引入了std :: ssize()?

为什么QuantLib引入了Handle类?

C ++ 11引入了标准化的内存模型。这是什么意思?它将如何影响C ++编程?

为什么在ConcurrentHashMap中JDK 8引入了CounterCell来解决计数问题?

为什么在 c++11 中调用了复制构造函数而不是移动构造函数?

用c ++()或{}委托构造函数

为什么C ++引入了duration_cast而不是使用static_cast?

为什么C ++ 11从std :: vector的fill构造函数原型中删除默认值?

C ++-为什么在没有明显的构造函数匹配时为什么会编译此代码?

C ++为什么要调用复制构造函数?

为什么C ++隐式调用父默认构造函数?

C ++:为什么未调用move构造函数?

为什么C#构造函数无法推断类型?

为什么在构造时调用C ++类的析构函数?

为什么C ++构造函数不能添加新的成员变量?

c ++:为什么在这里调用构造函数

为什么不构造内部类?C ++

为什么不确定性,当我注入了多个构造函数的参数?

为什么“ override”在C ++ 11中结尾?

为什么在C ++ 11中需要decltype?

为什么C ++ 11删除的函数参与重载解析?

为什么add函数在c ++ 11线程中无效?

为什么C ++函数调用便宜?

C ++为什么变量是函数而不是对象?

为什么不调用该函数?C ++

为什么C ++ 17引入std :: aligned_alloc?

Xcode 11中引入了什么“开发资产”功能以及如何使用它?