我想知道为什么在这种情况下我需要声明一个默认构造函数。首先,如果我把它遗漏,编译器是否会自动执行此操作?无论如何,我仍然不明白为什么它是必要的。此外,即使我省略'obj_B = origin.obj_B;'
,我也会收到错误class B
{
public:
bool theArray[5] ;
B(bool x) {theArray[1] = x;};
//B(){};
};
class A
{
public:
B obj_B;
A() : obj_B(1) {};
A(A const &origin) {obj_B = origin.obj_B;}; //error:no matching function for call
//to B::B()
};
int main ()
{
std::vector <A> someAs;
for(int q=0;q<10;q++)
someAs.push_back(A());
for(int q=0;q<10;q++)
std::cout << someAs[q].obj_B.theArray[1] << std::endl;
}
答案 0 :(得分:6)
如果您没有指定备用构造函数,编译器只会创建一个默认构造函数。
因为你做了:
B(bool x) {theArray[1] = x;}
不会为您创建默认构造函数。
您获得的具体错误是因为A(A const和amp)并未明确指定用于obj_B的构造函数。
以下代码可行:
A(A const &origin) : obj_B(1) {obj_B = origin.obj_B;}
顺便说一句,你不需要在函数定义上使用尾随分号。
答案 1 :(得分:2)
如果没有为类定义任何 ctors,编译器将合成默认构造函数。如果你定义了另一个构造函数(例如,一个带参数的构造函数),那么编译器会不为你合成一个构造函数,你必须自己定义一个。
如果您关心,C ++ 0x会添加“= default;”声明告诉编译器提供默认提供的ctor,即使你已经定义了另一个ctor。
答案 2 :(得分:2)
要为A
定义一个不需要B
的默认构造函数的复制构造函数,请使用成员初始化程序语法:
class A {
public:
A(A const& origin) : obj_B(origin.obj_B) {}
//...
};
答案 3 :(得分:0)
最后一点......
假设您没有定义非默认构造函数,则无法定义默认构造函数会导致 theArray [] 的元素未定义。这是一个坏习惯,通常会导致路上的错误。