c++函数中引用返回的目的是什么?

What is the purpose of returning by reference in C++ functions?

本文关键字:是什么 返回 函数 引用 c++      更新时间:2023-10-16

我的问题是关于在函数中通过引用返回。例如,代码是:

main.cpp

class Vector{
public:
    Vector(int a , int b){
        x = a;
        y= b;
    }
    Vector() { }
    int x = 1;
    int y = 1;
};
Vector& operator+(const Vector& lvec ,const Vector& rvec ){
    Vector resvec;
    resvec.x = lvec.x + rvec.x;
    resvec.y = lvec.y + rvec.y;
    return resvec;
}
int main(){
    Vector vecone(1,2);
    Vector vectwo(1,2);
    Vector resultvec = vecone + vectwo;
    cout<<endl<<"X:"<<resultvec.x<<endl<<"Y:"<<resultvec.y;
}

它运行和工作得很好,但是,我似乎不理解引用操作符(&)的目的。在操作符重载函数中,但我在许多包含操作符重载函数的源代码中看到过它。当我取消运算符时,程序似乎运行得很好,所以我的问题是-在函数中通过引用返回的目的是什么?在我介绍的代码中,它是否有特殊的目的?

操作符

的定义
Vector& operator+(const Vector& lvec ,const Vector& rvec ){
Vector resvec;
resvec.x = lvec.x + rvec.x;
resvec.y = lvec.y + rvec.y;
return resvec;
}

是错误的。它返回对局部对象resvec的引用,该引用将在控件退出函数后被销毁。所以引用将是无效的,结果程序有未定义的行为。

正确的定义应该是

Vector operator +( const Vector& lvec , const Vector& rvec )
{
    return { lvec.x + rvec.x, lvec.y + rvec.y };
}

Vector operator +( const Vector& lvec , const Vector& rvec )
{
    return Vector( lvec.x + rvec.x, lvec.y + rvec.y );
}

或者返回类型可以声明为const Vector

然而,引用作为返回类型经常被使用,特别是在下标操作符

的声明中。

考虑例如

下面是一个示范程序

#include <iostream>
class Vector
{
public:
    Vector( int a , int b ) : x( a ), y( b )
    {
    }
    Vector() : x( 0 ), y( 0 )
    { 
    }
    size_t size() const { return 2; }
    int & operator []( size_t i ) { return i == 0 ? x : y; }
    int operator []( size_t i ) const { return i == 0 ? x : y; }
private:
    int x;
    int y;
};
int main() 
{
    Vector v( 10, 20 );
    for ( size_t i = 0; i < v.size(); i++ ) std::cout << v[i] << ' ';
    std::cout << std::endl;
    for ( size_t i = 0; i < v.size(); i++ ) ++v[i];
    for ( size_t i = 0; i < v.size(); i++ ) std::cout << v[i] << ' ';
    std::cout << std::endl;
}

输出为

10 20 
11 21 

关键是operator+必须根据语言语法以适合其功能的方式重载。

当您有(a + b) + c时,子表达式(a + b)应该返回一个临时值,然后将其添加到c。所以返回一个引用是没有意义的,因为a + b应该生成一个不同于其他值的新值。

确实可以返回对

的引用
  • 一个已存在的对象,这在语义上是错误的,因为它意味着你在+二进制操作符不应该改变的时候改变了一些东西。
  • 是一个临时对象,但是返回一个对临时对象的引用会给你留下一个悬垂的引用(这就是你的情况)

这就是为什么通常operator+应该返回T,而不是T&。对于operator+=operator++这样的操作符,情况正好相反,它们确实会改变被调用对象的状态,因此在这种情况下,返回引用是正确的选择。