默认构造函数和对象复制

时间:2011-02-21 03:23:58

标签: c++ constructor assignment-operator copying

我想知道为什么在这种情况下我需要声明一个默认构造函数。首先,如果我把它遗漏,编译器是否会自动执行此操作?无论如何,我仍然不明白为什么它是必要的。此外,即使我省略'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;
}

4 个答案:

答案 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 [] 的元素未定义。这是一个坏习惯,通常会导致路上的错误。