【问题标题】:Why passing value-returning function works fine on operator function to overload = operator and not on others?为什么传递值返回函数在运算符函数上可以正常工作以重载 = 运算符而不是其他运算符?
【发布时间】:2020-07-06 20:45:41
【问题描述】:

看看这段代码:

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; 

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

test operator+ (const test&) const;

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

test& operator= (const test&);

这清楚地表明它只接受参考。那么为什么编译器在这里没有给出错误。 (顺便说一下,按值返回对象的实际含义是什么)

【问题讨论】:

    标签: c++ oop reference operator-overloading return-value


    【解决方案1】:

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

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

    但在第二个示例中,operator= 采用了一个 const 引用,这就完全不同了。

    按值返回对象仅表示返回类型不是引用的函数。

    【讨论】:

    • 除了在第二种情况下,test d = a + b; 根本不使用operator=,它只是test d(a + b); 的语法糖,所以它实际上会使用复制构造函数,在这个case 将由编译器隐式生成为test(const test&)
    • 那么为什么我们在重载 friend ostream& operator << (ostream&, const className&);
    • @BilalSheikh 因为ostream 的输出方法不是 const 方法。所以使用const ostream&amp; 意味着你不能调用大部分的ostream 方法(试试看)。理解 const 在 C++ 中非常重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多