美文网首页每天写500字每周500字
[C++11阅读]继承构造函数和委派构造函数

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

作者: 凌霄阁2010 | 来源:发表于2020-05-20 00:01 被阅读0次

    在我看来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”

    相关文章

      网友评论

        本文标题:[C++11阅读]继承构造函数和委派构造函数

        本文链接:https://www.haomeiwen.com/subject/cehiohtx.html