C++11:22委托构造函数和继承构造函数

22、委托构造函数和继承构造函数

0、课前秀

1、委托构造函数

  • 委托构造函数:允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。

  • 没有用构造函数的场景(无实际意义)

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

int main()
{
    class_c c1{1,3,2};
}
  • 使用委托构造函数需要注意:使用了代理构造函数就不能用类成员初始化了
class class_a{
public:
    class_a(){}
    //member initialization here, no delegate
    class_a(string str):m_string(str){}

    //调用了委托构造函数,不能用类成员初始化了
    //error C3511: a call to a delegating constructor shall be the only member-initializer
    class_a(string str, double dbl):class_a(str),m_double(dbl){}

    //只能通过成员赋值来初始化
    class_a(string str, double dbl):class_a(str){m_double = dbl;}
    double m_double{1.0};
    string m_string;
};

2、继承构造函数

  • 可以让派生类直接使用基类的构造函数,而无须自已再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派s生类构造函数的编写
struct Base
{
    int x;
    double y;
    string s;

    Base(int i):x(i),y(0){}
    Base(int i, double j):x(i),y(j){}
    Base(int i, double j,const string& str):x(i),y(j),s(str){}
}

//直接派生,会报错
struct Derived1 : Base
{

};

int main()
{
    Derived1 d(1,2.5,"ok"); //编译错误,没有合适的构造函数
}

//在派生类中定义构造函数
struct Derived2 : Base
{
    Derived2(int i):Base(i) {}
    Derived2(int i, double j):Base(i,j) {}
    Derived2(int i, double j, const string& str):Base(i,j,str) {}
};

int main()
{
    int i = 1;
    double j = 1.23;
    Derived2 d(i);
    Derived2 d1(i,j);
    Derived2 d2(i,j,"");
    return 0;
}

struct Derived : Base
{
    using Base::Base; //声明使用基类构造函数
};

int main()
{
    int i = 1;
    double j = 1.23;
    Derived d(i);  //直接使用基类构造函数来构造派生类对象
    Derived d1(i,j);
    Derived d2(i,j,"");
    return 0;
}

ReadMe

  • 20200508看完第一版,《深入应用C++11》

原文链接: https://www.cnblogs.com/fewolflion/p/12960338.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++11:22委托构造函数和继承构造函数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350700

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:28
下一篇 2023年3月2日 上午6:28

相关推荐