简体   繁体   English

分配期间未调用构造函数

[英]Constructor not being called during assignment

I am trying to understand the following code. 我试图理解以下代码。

I created two classes BClass and DClass as follows. 我如下创建了两个类BClass和DClass。

//My Header file //我的头文件

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

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

//My cpp file //我的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");
}

//My main file //我的主文件

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();

At the last section, I was expecting that BClass constructor to be called. 在最后一节中,我期望可以调用BClass构造函数。 But it did not. 但事实并非如此。 Could someone please explain me what is going on? 有人可以解释一下发生了什么吗?

If do like this, we know BClass constructor is called 如果这样做,我们知道调用了BClass构造函数

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

Could some one explain the difference between 可以解释一下两者之间的区别吗

BClass b2 = d;

and

BClass b2; 
b2 = d;

Thank you. 谢谢。

BClass b2 = d; calls copy constructor of BClass , which is implicitly generated by the compiler because all conditions for its implicit generation are met. 调用BClass 副本构造 BClass ,该构造函数由编译器隐式生成,因为满足其隐式生成的所有条件。

BClass b2; b2 = d; calls default constructor of BClass and then it calls the copy assignment operator, which is also implicitly generated. 调用BClass默认构造BClass ,然后调用复制分配运算符,该运算符也是隐式生成的。

The copy constructor is called instead look at this http://en.cppreference.com/w/cpp/language/copy_constructor 复制构造函数被调用,而不是看这个http://en.cppreference.com/w/cpp/language/copy_constructor

BClass b2 = d;

The copy constructor is called, if you don't implement it it automatically generated by the compiler 复制构造函数被调用,如果不实现,它将由编译器自动生成

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

implement copy constructor and assignment operator, print hints to see the difference 实现复制构造函数和赋值运算符,打印提示以查看差异

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM