每天写500字每周500字

[C++11阅读]继承构造函数和委派构造函数

2020-05-20  本文已影响0人  凌霄阁2010

在我看来C++构造函数已经够复杂了,继承构造和委派构造,包括下一篇要提到的移动构造,使情况变得更复杂,对新手更不友好。
C++11新特性继承构造函数和委派构造函数主要用于比较复杂的类,包含多个成员变量,动辄好几个构造函数的那种类,可以减少构造函数的个数,缩短代码。而移动构造函数是用来提升代码执行效率的,与本篇提到的二者出发点不同,分开两篇讨论。

继承构造函数

简单的说,用一句话可以把基类的构造函数如数继承下来。
有的基类构造函数特别复杂,众所周知,派生类是不会继承基类构造函数的。之前C++有个规则是可以通过using调用基类的成员函数,C++11把它扩展到了构造函数。

struct A
{
    A(int i) {}
    A(double d, int i) {}
    A(float f, int i, const char* c) {}
};
struct B : A
{
    using A::A;  // 继承构造函数
    virtual void ExtraInterface(){}
};

实测g++编译也能过,但会报一句“inheriting constructors only available with -std=c++11”

委派构造函数

就是把公共需要初始化的变量抽出来放在一个构造函数里,称为目标构造函数,其他构造函数在初始化列表中调用目标构造函数,称为委派构造函数。就好比有一个公共的被委托人,其他人委托他去做一些公共的事。目标构造函数可以有多个。
委派构造函数只能在初始化列表中调用目标构造函数,不能在函数体里调用。
值得注意的是,委派构造函数不能在初始化列表里写其他成员变量的初始化了。

class Info
{
public:
    Info() : Info(1, 'a') {}
    Info(int i) : Info(i, 'a') {}
    Info(char e) : Info(1, e) {}
private:
    Info(int i, char e) : type(i), name(e)
    {/* other initialize */ }
    int type;
    char name;
};

实测g++编译也能过,但会报一句“delegating constructors only available with -std=c++11”

上一篇下一篇

猜你喜欢

热点阅读