调用构造函数还是等号重载? C++
假设我想让一个float赋值给 含有两个成员变量的Complex对象
1 class Complex { 2 private: 3 float a,b; 4 };
在执行这样的赋值时,什么情况下使用operator=,什么情况使用类型转换构造函数呢?
case 1:
在初始化的时候使用 Complex(float) 构造函数。
Complex c = 2.2f;
case 2:
在赋值时,优先使用 Complex& operator=(float) 重载;
1 Complex c; 2 c = 2.2f;
case 3:
在赋值时,如果没有相应的 operator= 重载,会调用类型转换构造函数生成一个临时对象,使用这个临时对象进行赋值。
这时赋值也是优先使用 operator= 重载。如果没有相应重载,编译器会生成默认的 Complex& operator=(const Complex&) 进行操作,安排对象中的变量挨个进行赋值(注意深拷贝浅拷贝的问题)。
!注意,如果在类型转换构造函数前加上 explicit 关键字,则不会进行上述类型转换(也叫做隐式转换)生成临时对象。
!注意,临时对象在使用时有可能会作为参数传入某个函数(如上面的情况,作为参数传入构造函数 / operator=),所以在写函数参数时要考虑这种情况,使用const引用或者右值引用避免报错。