C++重载=运算符隐式类型转换的参数作用与转换方向疑问
C++类隐式类型转换示例与问题解答
参考示例代码
以下为类型转换相关示例代码:
// implicit conversion of classes: #include <iostream> using namespace std; class A {}; class B { public: // conversion from A (constructor): B (const A& x) {} // conversion from A (assignment): B& operator= (const A& x) {return *this;} // conversion to A (type-cast operator) operator A() {return A();} }; int main () { A foo; B bar = foo; // calls constructor bar = foo; // calls assignment foo = bar; // calls type-cast operator return 0; }
问题解答
重载赋值运算符对传入A类型参数的处理逻辑
这个重载的operator=是为了演示语法写的最小化桩实现,对传入的A类型参数没有做任何实际业务处理。
它的函数体仅写了return *this;,既没有读取形参x的任何成员数据,也没有将x的状态拷贝、同步到当前被赋值的B对象(即this指向的bar实例)中,存在的意义只是满足C++函数语法要求,让代码可以正常编译通过,用来演示“类可通过重载赋值运算符支持跨类型赋值”的规则。如果是实际业务场景下的实现,需要在这个函数体内补充从A对象提取数据、赋值给当前B对象对应成员的逻辑。
bar = foo;语句中的隐式转换说明
这行语句没有发生任何隐式类型转换。
隐式类型转换的触发前提是:编译器在当前上下文找不到类型完全匹配的重载实现,需要自动把实参转为目标类型才能完成调用。但在这行赋值语句中:
- 左值是已经初始化完成的B类型对象bar
- 右值是A类型对象foo
- 类B已经明确定义了形参为
const A&的赋值运算符重载,和右值foo的类型完全匹配
编译器做重载决议时会直接选中这个赋值运算符,把foo作为实参直接绑定到形参x上完成调用,全程不需要对foo或bar做任何类型转换。
这里容易和同一段代码里的另外两行逻辑混淆,可以对照理解:
B bar = foo;属于拷贝初始化场景,编译器需要构造一个B类型的对象bar,传入的初始值是A类型,因此会触发A类型到B类型的隐式转换,调用B的转换构造函数完成初始化foo = bar;中左值是A类型对象foo,右值是B类型对象bar,类A没有定义接收B类型参数的赋值运算符,因此会触发B类型到A类型的隐式转换,调用B的类型转换运算符operator A()把bar转为A类型临时对象,再调用A的默认拷贝赋值完成操作。
内容的提问来源于stack exchange,提问作者ali rahimi
相关产品推荐
相关产品推荐

