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;
}
它运行和工作得很好,但是,我似乎不理解引用操作符(&)的目的。在操作符重载函数中,但我在许多包含操作符重载函数的源代码中看到过它。当我取消运算符时,程序似乎运行得很好,所以我的问题是-在函数中通过引用返回的目的是什么?在我介绍的代码中,它是否有特殊的目的?
操作符
的定义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++
这样的操作符,情况正好相反,它们确实会改变被调用对象的状态,因此在这种情况下,返回引用是正确的选择。
相关文章:
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 返回类型在 C++ OOP 中是什么意思
- 在C++中返回 IO 对象的目的是什么?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- T*&返回类型到底是什么
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 使用作为参数返回的指针的最佳做法是什么
- 返回向量元素的 l 值的正确方法是什么?
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- CUDA返回值错误35的含义是什么
- c++运算符重载-我实际返回的操作数类型是什么
- GetWindowRect()返回的大小小于游戏的实际可见窗口的可能原因是什么
- 运算符和返回类型是什么意思?
- 返回布尔值在 cocos2dx 的 onTouchBegan() 中是什么意思?
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 在下面函数的返回中添加 const 限定符的重要性是什么?
- 在C++中将结构从被调用函数返回到调用函数的适当方法是什么
- 是什么意思,返回值是一个类名,后跟一对空括号
- 返回没有 typedef 的成员函数指针的语法是什么?