[英]C++ Default Constructor Called
在下面的代码中,类B的成员类型为类A(varA1)。 我想创建一个B类对象,其中成员varA1打算使用A类中的非默认构造函数A(int v1)。
#include <iostream>
using std::cout; using std::endl; using std::string;
class A {
public:
A() { cout << "A default constructor" << endl;}
A(int v1);
private:
int var1;
};
A::A(int v1) {
cout << "A int constructor" << endl;
var1 = v1;
}
class B {
public:
B() { cout << "B default constructor" << endl;}
B(int v1);
private:
int var1;
A varA1;
};
B::B(int v1) {
cout << "B int constructor" << endl;
var1 = v1;
A varA1(int v1);
}
int main()
{
A TestA(1);
B TestB(1);
return 0;
}
但是,当我运行上面的代码时,我得到以下输出:
A int constructor
A default constructor
B int constructor
我在这里一定做错了。 我需要更改什么,以便B类在A类中使用非默认构造函数A(int v1)?
我正在使用ubuntu 14.04LTS。 GNU G ++ 4.9和5.1给出了相同的结果。
在此先感谢您阅读和回答。
使用成员初始化列表 :
B::B(int v1) : var1(v1), varA1(v1) {
cout << "B int constructor" << endl;
}
请注意,成员的初始化(构造)顺序与在类中声明的顺序相同,因此在成员初始化列表中切换顺序不会更改构造发生的顺序(希望编译器对此发出警告) 。 如果你试图建立这个小细节就变得很重要varA1
从var1
和var1
是后宣布varA1
在类定义。
顺便说一下,所有这行代码都在B::B(int v1)
构造函数内完成:
A varA1(int v1);
正向声明一个名为varA1
的函数,该函数varA1
一个int
参数并返回一个A
对象。 这与最烦人的解析有半相似之处,尽管实际上并不是最烦人的解析。
您可以在B :: B(int)构造函数中使用初始化列表:
B::B(int v1) : varA1(v1) {
cout << "B int constructor" << endl;
var1 = v1;
}
如果您不希望使用默认的ctor,则可以使用
A(void) = delete;
但是请注意,您可以临时添加此声明作为诊断措施,以使编译器通知您要使用默认ctor的代码。
通过更换
A() { std::cout << "A default constructor" << std::endl;}
同
A() = delete;
编译器会抱怨在B :: B(int v1)的正文中使用了已删除的函数'A :: A()'。
因此,简短检查确定B的第二个数据属性(即“ B :: varA1”)使用A的默认ctor(现已删除)。
您还可以考虑通过在B ctor的初始化程序列表中显式调用“ varA1(0)”来“固定” B ctor以不使用A的默认ctor。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.