c – 在对象被激活之后,使用隐式转换而不是赋值运算符调用构造函
发布时间:2020-12-16 03:10:32 所属栏目:百科 来源:网络整理
导读:考虑下面的例子: #include iostreamusing std::cout;using std::endl;class CBox{public: CBox(double lv = 1.0,double wv = 1.0,double hv = 1.0) : m_Length {lv},m_Width {wv},m_Height {hv} { cout "Constructor called" endl; } //CBox operator=(doub
考虑下面的例子:
#include <iostream> using std::cout; using std::endl; class CBox { public: CBox(double lv = 1.0,double wv = 1.0,double hv = 1.0) : m_Length {lv},m_Width {wv},m_Height {hv} { cout << "Constructor called" << endl; } //CBox& operator=(double) //{ // cout << "Assignment operator called" << endl; // return *this; //} double volume() const { return m_Length* m_Width* m_Height; } private: double m_Length; double m_Width; double m_Height; }; int main() { CBox box {1.0,1.0,1.0}; // no need for intializer list,but put it anyway box = 2.0; // why is this calling constructor again ?! cout << box.volume() << endl; // prints 2 } 请注意,我有意地注释掉了重载的赋值运算符. 执行此程序会产生以下输出: Constructor called Constructor called 2 我注意到,即使box对象已被初始化,下一个语句也是故意地调用构造函数.这是什么意思? 我知道这可以通过explicit关键字来防止,所以构造函数将是: explicit CBox(double lv = 1.0,m_Height {hv} { cout << "Constructor called" << endl; } 但我宁愿期望影响如下结构: CBox box = 2.0; 当然,当我取消注释重载的赋值运算符时,它优先于构造函数. 解决方法
没有隐含的CBox :: operator =(double),所以box = 2.0;必须创建一个临时的CBox对象.相当于box = CBox(2.0);.
使你的构造函数显式不允许从double转换为CBox的隐式转换,所以没有适当的赋值运算符存在,并且你得到一个编译错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |