sky*_*oor 45 c++ operator-overloading
我有一个关于C++中运算符重载的返回值的问题.通常,我发现了两种情况,一种是按值返回,一种是按引用返回.那么这个规则是什么呢?特别是在可以连续使用操作员的情况下,例如cout<<x<<y.
例如,当实现+操作"string +(string)"时.你将如何通过ref或val返回返回值.
Tyl*_*nry 68
一些运算符按值返回,一些通过引用返回.通常,结果为新值(例如+, - 等)的运算符必须按值返回新值,并且运算符的结果是现有值,但已修改(例如<<,>>,+ =, - =等),应该返回对修改后的值的引用.
例如,cout是一个std::ostream,并且将数据插入到流中是一个修改操作,因此为了实现<<操作符插入ostream,运算符的定义如下:
std::ostream& operator<< (std::ostream& lhs, const MyType& rhs)
{
// Do whatever to put the contents of the rhs object into the lhs stream
return lhs;
}
Run Code Online (Sandbox Code Playgroud)
这样,当你有一个复合语句时cout << x << y,cout << x首先计算子表达式,然后计算表达式[result of cout << x ] << y.由于operator <<on x返回一个引用cout,表达式[result of cout << x ] << y等同于cout << y,如预期的那样.
相反,对于"string + string",结果是一个新字符串(两个原始字符串都保持不变),因此它必须按值返回(否则您将返回对临时的引用,这是未定义的行为).
小智 13
要尝试回答有关字符串的问题,字符串的运算符+()几乎总是作为自由(非成员)函数实现,以便可以对任一参数执行隐式转换.那就是你可以说的话:
string s1 = "bar";
string s2 = "foo" + s1;
Run Code Online (Sandbox Code Playgroud)
鉴于此,并且我们可以看到两个参数都不能更改,它必须声明为:
RETURN_TYPE operator +( const string & a, const string & b );
Run Code Online (Sandbox Code Playgroud)
我们暂时忽略RETURN_TYPE.由于我们无法返回任何参数(因为我们无法更改它们),因此实现必须创建一个新的连接值:
RETURN_TYPE operator +( const string & a, const string & b ) {
string newval = a;
newval += b; // a common implementation
return newval;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们将RETURN_TYPE作为引用,我们将返回对本地对象的引用,这是一个众所周知的禁忌,因为函数外部不存在本地对象.所以我们唯一的选择是返回一个值,即一个副本:
string operator +( const string & a, const string & b ) {
string newval = a;
newval += b; // a common implementation
return newval;
}
Run Code Online (Sandbox Code Playgroud)
如果您希望运算符重载的行为类似于内置运算符,则规则非常简单; 该标准确切地定义了内置运算符的行为方式,并将指示内置的结果是a rvalue还是a lvalue.
您应该使用的规则是:
rvalue则重载应该返回引用lvalue那么你的重载应该返回一个值但是,您的重载不需要返回与内置相同类型的结果,尽管除非您有充分的理由不这样做,否则应该执行此操作.
例如,KennyTM在对另一个答案的评论中指出,流为<<和>>运算符重载了对左操作数的引用,这不是内置函数的工作方式.但是流接口的设计者做到了这一点,因此流I/O可以被链接.
| 归档时间: |
|
| 查看次数: |
45942 次 |
| 最近记录: |