0

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

4 回答 4

6

如果您不指定备用构造函数,编译器只会创建默认构造函数。

因为你做了:

B(bool x) {theArray[1] = x;}

不会为您创建默认构造函数。

您得到的具体错误是因为 A(A const &origin) 没有明确指定用于 obj_B 的构造函数。

以下代码将起作用:

A(A const &origin) : obj_B(1) {obj_B = origin.obj_B;}

顺便说一句,函数定义上不需要尾随分号。

于 2011-02-21T03:28:59.713 回答
2

如果您没有为类定义任何ctor,编译器将合成一个默认构造函数。如果您定义了另一个构造函数(例如,一个带参数的构造函数),那么编译器不会您合成一个,您必须自己定义一个。

如果您关心,C++ 0x 添加了一个“=default;” 声明告诉编译器提供一个默认情况下会提供的 ctor,即使您已经定义了另一个 ctor。

于 2011-02-21T03:30:12.940 回答
2

要为其定义A不需要默认构造函数的复制构造函数B,请使用成员初始值设定项语法:

class A {
public:
    A(A const& origin) : obj_B(origin.obj_B) {}
    //...
};
于 2011-02-21T03:36:45.250 回答
0

最后一点...

假设您没有定义非默认构造函数,未能定义默认构造函数将导致theArray[]的元素未定义。这是一个坏习惯,通常会导致错误。

于 2011-02-21T04:32:35.963 回答