构造函数可以在 c++ 中调用另一个类的构造函数吗?
Can constructor call another class's constructor in c++?
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
。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 关于复制构造函数的一个棘手问题
- C++构造函数,一个用于度,一个用于弧度
- 关于QLIST类型实例复制构造函数的一个奇怪问题
- 需要使班级(long_number)用构造函数和一个打印功能代表1到60的任何长度
- 运算符 = 不匹配,构造函数创建一个指针
- 为什么我不能在 c++ 类中声明一个空构造函数,该构造函数从一个具有私有构造函数的构造函数扩展而来
- 如何使构造函数接受一个非常量对象
- 初始值设定项列表,可变参数模板和构造函数推导:一个奇怪的情况
- shared_ptr的原始指针构造函数是一个错误吗?
- 当这个构造函数接受一个初始值设定项列表并委托一个向量时,是什么导致它委托给自己
- C++11使variadic构造函数了解一个初始化列表的初始化列表
- 为什么这个initializer_list构造函数是一个可行的重载
- 为什么我的Arduino类构造函数需要一个参数
- 内联构造函数和一个定义规则
- 如何通过构造函数将一个类的实例传递给另一个类
- 如何用g++构造在另一个文件中定义的类
- 在另一个类中使用自定义构造函数声明一个类
- 如何从另一个构造函数调用一个c++类的构造函数
- 模板中的构造函数不同:一个用于字符串,另一个用于其他任何东西