在分配期间未调用构造函数

时间:2015-05-18 18:21:02

标签: c++

我想了解以下代码。

我创建了两个类BClass和DClass,如下所示。

//我的页眉文件

class BClass
{
    public:
        BClass();
        ~BClass();
    virtual void PrintMe() const;
};

class DClass : public BClass
{
    public:
        DClass();
        ~DClass();
    void PrintMe() const;
};

//我的cpp文件

BClass::BClass()
{
}


BClass::~BClass()
{
}

void BClass::PrintMe() const
{
    printf("This is base class \n");
}

DClass::DClass()
{
}

DClass::~DClass()
{
}

void DClass::PrintMe() const
{
    printf("This is derived class \n");
}

//我的主文件

BClass b; //BClass constructor called
b.PrintMe();

DClass d; //DClass constructor called
d.PrintMe();

BClass* b1 = &d; //No constructor called as it is pointer assignment
b1->PrintMe();

BClass b2 = d;  //No constructor called...expecting BClass constructor to be called???
b2.PrintMe();

在最后一节,我期待调用BClass构造函数。但事实并非如此。有人可以解释一下发生了什么吗?

如果这样做,我们知道BClass构造函数被称为

BClass b2; //BClass constructor called
b2 = d;  

有人可以解释

之间的区别
BClass b2 = d;

BClass b2; 
b2 = d;

谢谢。

2 个答案:

答案 0 :(得分:5)

BClass b2 = d;调用BClass的{​​{3}},这是由编译器隐式生成的,因为它的隐式生成的所有条件都已满足。

BClass b2; b2 = d;调用BClass的默认构造函数,然后调用复制赋值运算符,该运算符也是隐式生成的。

答案 1 :(得分:1)

调用复制构造函数而不是查看此http://en.cppreference.com/w/cpp/language/copy_constructor

BClass b2 = d;

复制构造函数被调用,如果你没有实现它,它会由编译器自动生成

BClass b2; //The default constructor is called at line 1
b2 = d;//The assignment operator is called

实现复制构造函数和赋值运算符,打印提示以查看差异