看一段代码:
#include <iostream>
class CBox
{
private:
double m_Length;
double m_Width;
double m_Height;
public:
double volume()
{
return m_Length*m_Width*m_Height;
}
CBox(double lv=1.0,double wv=1.0,double hv=1.0)
{
std::cout<<"Constructor called."<<std::endl;
m_Length=lv;
m_Width=wv;
m_Height=hv;
}
~CBox()
{
std::cout<<"Destructor"<<std::endl;
}
};
int main()
{
CBox box;
box=99.0;
std::cout<<box.volume()<<std::endl;
return 0;
}
创建box时调用了constructor,
第二句 box=99.0 ,一个隐式转换把 double 值99.0转换为CBox{99.0,1.0,1.0} (因为构造函数有后两个默认值)
因此又调用一次constructor,但是立刻又destructor,因为只是临时转换一下拿来给box赋值用
如果给CBox构造函数前面加explicit,那么可以禁止这种隐式转换,这样代码就编译不过