C++ 为什么重载运算符可以返回其返回类型以外的内容?
我正在为即将到来的一次考试进行练习,在一次练习中我发现了一段奇怪的代码。在上下文中,这是一个必须确定代码是否会运行、有什么问题等的练习。我觉得奇怪的代码如下:C++ 为什么重载运算符可以返回其返回类型以外的内容?,c++,oop,operator-overloading,C++,Oop,Operator Overloading,我正在为即将到来的一次考试进行练习,在一次练习中我发现了一段奇怪的代码。在上下文中,这是一个必须确定代码是否会运行、有什么问题等的练习。我觉得奇怪的代码如下: class A { int x; public: A(int i = 0) { x = i;} A operator+(const A& a) { return a.x + x;} ...\\ rest of the code is not relevant }; 当然,我假设操作符会生成一个错误
class A {
int x;
public:
A(int i = 0) { x = i;}
A operator+(const A& a) { return a.x + x;}
...\\ rest of the code is not relevant
};
当然,我假设操作符会生成一个错误,因为它返回一个int值,而它的返回类型被定义为class A。然而,在我的IDE中插入整个示例之后,为了检查我是否正确,不仅在函数声明中没有抛出错误,但代码中后来的一个加法操作实际上“起作用”(我使用引号,因为它返回的值是垃圾,但也没有抛出任何错误)
为什么这不会引发任何错误?
int
通过A(int)
构造函数隐式转换为A
。您的操作符+
实际上执行返回一个{A.x+x}代码>
这并不是重载运算符特有的—每当提供一种类型的表达式而预期使用另一种类型时,编译器都在寻找将前者隐式转换为后者的方法。“其余代码不相关”:是否确定?然后删除该代码并运行程序。你仍然得到垃圾输出吗?标记A(int)
constructorexplicit
并观察发生了什么。我不再得到垃圾输出了;是的,似乎在其他地方有问题。正如前面提到的,这是一个隐式转换。有关控制隐式转换的规则,请参见。本例中的具体示例是该链接列表中的第三个示例