委托构造函数

目录

前言

委托构造函数

注意点


前言

如果一个类中重载了多个构造函数,并且在每个构造函数中都需要对某些变量进行初始化,这时候就会出现很多重复的代码,C++11中引入了委托构造函数,就是为了解决这个问题,它允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。

委托构造函数

委托构造函数是 C++11 引入的一种构造函数语法,它允许一个构造函数调用同一个类的其他构造函数,从而实现代码的重用和简化。

使用委托构造函数可以在一个构造函数中调用另一个构造函数,将一些构造逻辑共享给其他构造函数使用。这样可以避免重复编写相似的初始化代码,并提高代码的可维护性。

以下是一个示例:

修改前代码,存在初始化重复代码

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_c 类包含了三个构造函数。第三个构造函数是带三个参数的构造函数,它使用委托构造函数方式调用了带两个参数的构造函数,从而复用了初始化逻辑。第二个构造函数是带两个参数的构造函数,它同样使用委托构造函数方式调用了带一个参数的构造函数。第一个构造函数是带一个参数的构造函数,它负责初始化成员变量max。 每个构造函数将仅执行其他构造函数不会执行的工作。

在委托构造函数中,可以先调用其他构造函数,然后再根据需要对成员变量进行初始化或其他额外逻辑。

总结来说,委托构造函数是一种方便的语法,可以在同一个类中通过调用其他构造函数来共享初始化逻辑,提高代码的重用性和可维护性。

注意点

  • 构造函数的调用顺序,是先调用委托构造函数,再调用当前构造函数体,以此类推。
  • 委托构造函数只能在构造函数的初始值列表中使用,并且只能调用该类的其他构造函数。
  • 使用委托构造函数后不能再使用初始化列表进行成员初始化,只能使用构造函数体赋值的方式
class class_a {
public:
    class_a() {}
    // member initialization here, no delegate
    class_a(string str) : m_string{ str } {}

    //can't do member initialization here
    // 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 ) {}

    // only member assignment
    class_a(string str, double dbl) : class_a(str) { m_double = dbl; }
    double m_double{ 1.0 };
    string m_string;
};
  • 避免循环委托,构造函数委托语法不会阻止意外创建构造函数递归 , Constructor1 将调用 Constructor2(其调用 Constructor1),在出现堆栈溢出之前不会出错。 您应当避免循环。
class class_f{
public:
    int max;
    int min;

    // don't do this
    class_f() : class_f(6, 3){ }
    class_f(int my_max, int my_min) : class_f() { }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech Embedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值