在 C++ 函数中通过引用返回的目的是什么?
What is the purpose of returning by reference in C++ functions?
我的问题是关于在函数中通过引用返回。
例如,我有代码:
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;
}
它 运行 并且工作得很好,但是,我似乎不理解运算符重载函数中引用运算符 ( & ) 的用途,但我在许多源代码中看到它代码包含运算符重载函数。当我解雇运算符时,该程序似乎 运行 非常好,所以我的问题是 - 在函数中通过引用返回的目的是什么?它是否在我提供的代码中提供特殊的 objective?
这个运算符的定义
Vector& operator+(const Vector& lvec ,const Vector& rvec ){
Vector resvec;
resvec.x = lvec.x + rvec.x;
resvec.y = lvec.y + rvec.y;
return resvec;
}
错了。它 return 是对本地对象 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 );
}
或returned类型可以声明为const Vector
然而,作为return类型的引用经常被使用,尤其是在下标运算符的声明中
举个例子
这是一个演示程序
#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)
应该 return 一个临时值,然后将其添加到 c
。所以 return 引用是没有意义的,因为 a + b
应该生成一个与其他值不同的新值。
您确实可以return引用
- 一个现有的对象,这在语义上是错误的,因为它意味着你正在改变一些东西,而 + 二元运算符不应该。
- 临时对象,但return对临时对象的引用将只留下一个悬空引用(这就是你的情况)
这就是为什么通常 operator+
应该 return 一个 T
,而不是 T&
。这种情况与像 operator+=
或 operator++
这样的运算符相反,它们确实会改变对象的状态,因此在这种情况下 return 引用是正确的选择。
我的问题是关于在函数中通过引用返回。 例如,我有代码:
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;
}
它 运行 并且工作得很好,但是,我似乎不理解运算符重载函数中引用运算符 ( & ) 的用途,但我在许多源代码中看到它代码包含运算符重载函数。当我解雇运算符时,该程序似乎 运行 非常好,所以我的问题是 - 在函数中通过引用返回的目的是什么?它是否在我提供的代码中提供特殊的 objective?
这个运算符的定义
Vector& operator+(const Vector& lvec ,const Vector& rvec ){
Vector resvec;
resvec.x = lvec.x + rvec.x;
resvec.y = lvec.y + rvec.y;
return resvec;
}
错了。它 return 是对本地对象 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 );
}
或returned类型可以声明为const Vector
然而,作为return类型的引用经常被使用,尤其是在下标运算符的声明中
举个例子
这是一个演示程序
#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)
应该 return 一个临时值,然后将其添加到 c
。所以 return 引用是没有意义的,因为 a + b
应该生成一个与其他值不同的新值。
您确实可以return引用
- 一个现有的对象,这在语义上是错误的,因为它意味着你正在改变一些东西,而 + 二元运算符不应该。
- 临时对象,但return对临时对象的引用将只留下一个悬空引用(这就是你的情况)
这就是为什么通常 operator+
应该 return 一个 T
,而不是 T&
。这种情况与像 operator+=
或 operator++
这样的运算符相反,它们确实会改变对象的状态,因此在这种情况下 return 引用是正确的选择。