You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C++中complex类对象可直接被double类型变量赋值?

原理说明

这一行为合法的核心原因是C++的隐式构造转换规则:

  • 只要类中定义了仅接收一个参数、且没有被explicit关键字修饰的构造函数,编译器就允许将该入参类型的变量,自动转换为对应的类实例。
  • 你代码中定义的complex(double x)构造函数正好符合上述条件:仅接收1个double类型入参,没有加explicit修饰。

所以当执行c1 = i时,编译器会自动完成以下两步操作:

  1. 调用complex(double x)构造函数,以i的值作为入参生成一个临时的complex对象(该对象的re和im都为2)
  2. 调用类默认生成的拷贝赋值运算符,将临时对象的值赋值给c1

整个过程等价于你手动写了c1 = complex(i);,完全符合C++语法规则,因此编译器不会抛出错误。

如果要禁止这类隐式转换,只需要给单参数构造函数加上explicit修饰即可:

explicit complex(double x) {re = x, im = x;}

添加修饰后再执行c1 = i会直接编译报错,必须显式写出构造调用c1 = complex(i)才能正常编译。

内容的提问来源于stack exchange,提问作者Joc380

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:42:02