为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效

Why passing value-returning function works fine on operator function to overload = operator and not on others?

本文关键字:运算符 函数 其他 无效 有效 重载 返回 为什么      更新时间:2023-10-16

看看这个代码:

class test
{
int x;

public:
test ()
{
x = 3;
}
};
test returnObj (test &obj)
{
return obj;    
}
int main ()
{
test object;
returnObj (returnObj (object)); // line A
return 0;
}

这段代码将在A行给出错误,因为我们将按值返回函数作为实际参数传递,它只接受引用。到目前为止还不错。这很有道理。

假设我们为类测试重载了=+运算符。现在看看这个:

test a, b;
test d = a + b; 

该代码将创建两个类型测试的对象,将它们添加并将结果分配给对象d。但是重载+运算符的运算符函数的原型是:

test operator+ (const test&) const;

这意味着a+b将按值返回结果对象,然后将其传递给重载=运算符的运算符函数,其原型为:

test& operator= (const test&);

这清楚地表明它只接受参考。那么,为什么编译器在这里不给出错误呢。(顺便说一句,请说明通过值返回对象的实际含义(

区别在于单词const。C++中的规则是,不能将非常数引用绑定到临时引用。

这就是为什么第一个例子不起作用。函数的返回值是一种临时的,returnObj函数参数是一个非常数引用。如果您将test returnObj (test &obj)更改为test returnObj (const test &obj),它将编译。

但在第二个例子中,operator=采用了const引用,这就产生了所有的差异。

按值重新计算对象只意味着返回类型不是引用的函数。