默认构造函数和对象复制

Mat*_*son 0 c++ constructor copying assignment-operator

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

Whe*_*evo 6

如果未指定备用构造函数,则编译器仅创建默认构造函数.

因为你做了:

B(bool x) {theArray[1] = x;}
Run Code Online (Sandbox Code Playgroud)

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

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

以下代码可以工作:

A(A const &origin) : obj_B(1) {obj_B = origin.obj_B;}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您不需要在函数定义上使用尾随分号.