cpp委托构造函数

⌚Time: 2024-09-03 21:08:00

👨‍💻Author: Jack Ge

我在写代码时,认为自己cpp已经熟悉了,想当然的创造出了自己的用法。我认为由多个重载构造函数,就想调用别的构造函数来节省代码,却被编译器警告不可行。编译器可真不惯我毛病啊。

下面的例子就会报错。不能在构造函数里调用其它构造函数

class CA{
public:
    CA(int argA){
        //对argA的处理
        //...
    }   
    CA(int argA,int argB){
        //我尝试调用一个参数的构造函数来复用代码
        CA(argA);
        //对argB的处理
        //...
    }
};

解决办法也很简单,就是把公用的处理部分独立到一个函数中,用到的构造函数直接调用

public:
    CA(int argA){
        function(argA);
    }   
    CA(int argA,int argB){
        function(argA);
        //对argB的处理
        //...
    }
public:
    void function(int arg){
        //对arg的处理
        //...
    }

我查找资料,有办法在构造函数中调用重载构造函数,就是cpp11支持的委托构造函数,下面是InsCode AI 创作助手的回答

C++中的委托构造函数是指一个构造函数可以调用另一个构造函数来完成部分或全部的初始化工作。通过委托构造函数,可以减少代码的冗余,提高代码的可读性和可维护性。

在C++11引入委托构造函数的概念之前,如果一个类有多个构造函数,通常会将相同的初始化代码放在一个私有的辅助函数中,然后在各个构造函数中调用这个辅助函数。这样会产生一些冗余的代码。

使用委托构造函数可以直接在构造函数的初始化列表中调用其他构造函数,而不需要借助辅助函数。例如:

class MyClass {
public:
    MyClass(int x, int y, int z) : a(x), b(y), c(z) {}
    MyClass(int x, int y) : MyClass(x, y, 0) {}
    MyClass(int x) : MyClass(x, 0) {}
    MyClass() : MyClass(0) {}
private:
    int a;
    int b;
    int c;
};

在上面的例子中,每个构造函数都通过调用委托构造函数MyClass(int x, int y, int z)来完成初始化工作。这样就可以避免重复编写初始化代码,提高代码的可维护性。

需要注意的是,委托构造函数在初始化列表中的调用必须出现在当前构造函数的最开始位置,而且每个构造函数最多只能有一个委托构造函数的调用。

看AI写的例子,最后被委托的构造函数MyClass(int x, int y, int z)是在进行初始化成员列表,没有执行代码。所以我写了测试代码来实现委托构造函数

#include <iostream>
class CA{
public:
    CA(int arg){
        a = arg;
        std::cout<<"constructor 1 is executed.\n";
    }
    CA(int arg_0,int arg_1):CA(arg_0){
        b = arg_1;
        std::cout<<"constructor 2 is executed.\n";
    }
public:
    void print_member(){
        std::cout<<"a="<<a<<" b="<<b<<"\n";
    }
private:
    int a;
    int b;
};
int main(){
    CA ca(1,2);
    ca.print_member();
    return 0;
}

测试运行,果然被委托的构造函数里的代码被执行了。实现了代码复用

g++ t.cpp -std=c++11
a.exe
constructor 1 is executed.
constructor 2 is executed.
a=1 b=2

看样子像是子类对于父类的构造函数传参啊,也是这种形式。

class CA{
public:
    CA(int arg){

    }
};
class CB:public CA{
public:
    CB(int argA,int argB):CA(argA){

    }
};