调用构造函数还是等号重载? 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引用或者右值引用避免报错。

 

posted @ 2021-04-06 13:05  HarryPotterIsDead!  阅读(232)  评论(0编辑  收藏  举报