在C++函数中通过引用返回的目的是什么?

zLe*_*eon 2 c++ reference function object operator-keyword

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

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;
}
Run Code Online (Sandbox Code Playgroud)

它运行并运行良好,但是,我似乎不理解运算符重载函数中引用运算符(&)的用途,但我在很多源代码中都看到它包含运算符重载函数.当我解雇运算符时程序似乎运行得很好,所以我的问题是 - 在函数中通过引用返回的目的是什么?它在我提供的代码中是否有特殊目的?

Vla*_*cow 8

这个运营商的定义

Vector& operator+(const Vector& lvec ,const Vector& rvec ){
Vector resvec;
resvec.x = lvec.x + rvec.x;
resvec.y = lvec.y + rvec.y;
return resvec;
}
Run Code Online (Sandbox Code Playgroud)

是错的.它返回对本地对象的引用,该对象resvec将在控件退出函数后被销毁.因此引用将无效,因此程序具有未定义的行为.

正确的定义可能看起来像

Vector operator +( const Vector& lvec , const Vector& rvec )
{
    return { lvec.x + rvec.x, lvec.y + rvec.y };
}
Run Code Online (Sandbox Code Playgroud)

或者喜欢

Vector operator +( const Vector& lvec , const Vector& rvec )
{
    return Vector( lvec.x + rvec.x, lvec.y + rvec.y );
}
Run Code Online (Sandbox Code Playgroud)

或者返回类型可以声明为 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;
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

10 20 
11 21 
Run Code Online (Sandbox Code Playgroud)