为什么C++中complex类对象可直接被double类型变量赋值?
原理说明
这一行为合法的核心原因是C++的隐式构造转换规则:
- 只要类中定义了仅接收一个参数、且没有被
explicit关键字修饰的构造函数,编译器就允许将该入参类型的变量,自动转换为对应的类实例。 - 你代码中定义的
complex(double x)构造函数正好符合上述条件:仅接收1个double类型入参,没有加explicit修饰。
所以当执行c1 = i时,编译器会自动完成以下两步操作:
- 调用
complex(double x)构造函数,以i的值作为入参生成一个临时的complex对象(该对象的re和im都为2) - 调用类默认生成的拷贝赋值运算符,将临时对象的值赋值给
c1
整个过程等价于你手动写了c1 = complex(i);,完全符合C++语法规则,因此编译器不会抛出错误。
如果要禁止这类隐式转换,只需要给单参数构造函数加上explicit修饰即可:
explicit complex(double x) {re = x, im = x;}
添加修饰后再执行c1 = i会直接编译报错,必须显式写出构造调用c1 = complex(i)才能正常编译。
内容的提问来源于stack exchange,提问作者Joc380
相关产品推荐
相关产品推荐

