复制基类和派生类中的构造函数

时间:2017-10-16 20:16:50

标签: c++ inheritance copy-constructor

我不明白两件事:

1 - 在代码1中定义了对象d2时,调用了Base类的默认构造函数和Derived类的复制构造函数。但是在代码2中(派生类没有复制构造函数)只调用了Base类的复制构造函数! / p>

为什么要复制Base类的构造函数? Derived类的构造函数是否为?

2 -

之间有什么区别
int

 D d2 = d1 ; 

在这个例子中? 这是什么原因?

代码1

D d2;
d2 = d1;

代码2

//code 1
#include <iostream> 


using std::cout;
using std::endl;

///////////////////////////
class B
{
protected:
    int x;

public:
    B()
    {
        x = 4;
        cout << "default constructor of Base class " << endl;
    }

    B(int a)
    {
        x = a;
        cout << "parametric constructor of Base class" << endl;
    }

    B(const B &b)
    {
        x = b.x;
        cout << "copy constructor of Base class " << endl;
    }
};
////////////////////////////////////////////////////////////
class D : public B
{
private:
    int y;

public:
    D()
    {
        y = 5;
        cout << "default constructor of Derived class" << endl;
    }

    D(int k)
    {
        y = k;
        cout << "parametric constructor of Derived class" << endl;
    }
    D(D& copy)
    {

        cout << "copy constructor of Derived class" << endl;
    }


};
////////////////////////////////////////////////////////////
int main()
{
    D d1(3);

    D d2 = d1;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题1

在&#34;代码1,&#34;您已为派生类定义了复制构造函数。因此,编译器不再为您创建一个。由于您没有在字段初始化列表中专门调用基本构造函数,因此在派生类复制构造函数中,它首先要做的是调用基类的默认构造函数。

然而,在&#34;代码2,&#34;由于您不再为派生类定义了复制构造函数,因此编译器会为您隐式创建一个。见this question。最上面的答案解释了将调用基本拷贝构造函数。

问题2

来自this link

  

每当从同一类型的另一个对象初始化对象(通过直接初始化或复制初始化)时,都会调用复制构造函数(除非重载决策选择更好的匹配或调用被忽略),其中包括

     
      
  • 初始化:T a = b;或T a(b);,其中b是T型;
  •   

因此D d2 = d1;调用D副本构造函数,而D d2; d2 = d1;调用D默认构造函数,然后调用D赋值运算符。