构造函数可以在 c++ 中调用另一个类的构造函数吗?

Can constructor call another class's constructor in c++?

本文关键字:构造函数 另一个 c++ 调用      更新时间:2023-10-16
class A {
public:
    A(int v) {
        _val = v;
    }
private:
    int _val;
};
class B {
public:
    B(int v) {
        a = A(v); // i think this is the key point
    }
private:
    A a;
};
int main() {
    B b(10);
    return 0;
}

编译器 说:

test.cpp: In constructor ‘B::B(int)’:
test.cpp:15: error: no matching function for call to ‘A::A()’
test.cpp:5: note: candidates are: A::A(int)
test.cpp:3: note:                 A::A(const A&)

我学过Java,我不知道如何处理这个问题C++。搜索几天,请告诉我C++可以这样做吗?

需要使用成员初始化列表

B(int v):a(v)
{
}

跟:

B(int v) 
{
        a = A(v); // i think this is the key point
}

a赋值并且没有被初始化这是你想要的),一旦构造函数的主体开始{,它的所有成员都已经被构造了。

为什么会出现错误?
编译器在构造函数体{开始之前a构造,编译器使用 A 的 no 参数构造函数,因为您没有告诉它注意 1,因为默认的 no 参数构造函数不可用,因此出现错误。

为什么默认的无参数构造函数不是隐式生成的?
为类提供任何构造函数后,将不再生成隐式生成的无参数构造函数。您为 A 的构造函数提供了重载,因此没有隐式生成 no 参数构造函数。

注1
使用成员初始值设定项列表是告诉编译器使用构造函数的特定重载版本而不是默认的无参数构造函数的方法。

您必须使用初始化列表:

class B {
public:
    B(int v) : a(v) { // here
    }
private:
    A a;
};

否则,编译器将尝试使用默认构造函数构造A。由于您没有提供,因此会出现错误。

是的,它可以,但是您尚未为A提供默认构造函数(不带参数或所有参数都具有默认值的构造函数),因此只能在初始值设定项列表中对其进行初始化:

B(int v) : a(v) 
{
}

这是因为在构造函数主体进入之前,将使用默认构造函数(不可用)构造(或尝试构造)a