赋值期间未调用构造函数

Constructor not being called during assignment

本文关键字:调用 构造函数 赋值      更新时间:2023-10-16

我正在努力理解以下代码。

我创建了两个类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;

谢谢。

BClass b2 = d;调用BClass的复制构造函数,该构造函数由编译器隐式生成,因为它隐式生成的所有条件都满足。

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

调用复制构造函数,而不是查看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

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