2015-05-18 44 views
1

我想了解以下代码。构造函数在赋值期间未被调用

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

谢谢

BClass b2 = d; 

之间的差异。

回答

5

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

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

+0

谢谢你的解释。 – jaklucky

+0

即使使用DClass对象初始化,为什么b2.PrintMe()会调用BClass :: PrintMe()? – jaklucky

+0

@jaklucky,因为'b2'的类型是'BClass'(和[slicing](http://stackoverflow.com/q/274626/3959454)在赋值期间发生)。如果你想要虚拟行为,你可以编写'BClass&b2 = d'来创建一个引用,或者像你在代码中那样创建一个指针。 –

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 

实现的拷贝构造函数自动生成和分配操作员,打印提示以查看差异