use*_*219 1 c++ overloading reference prefix
当我找到的所有代码显示在重载前缀运算符时返回引用变量时,我感到困惑.我浏览了parashift.com常见问题解答(http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14)并不清楚,尽管它说它会很清楚当你读它.我把他们的例子改编成了一个荒谬的,毫无意义的小程序来测试.
#include<iostream>
using namespace std;
class Number {
public:
Number& operator++ (); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number& Number::operator++ () {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我只是将它声明为Number对象,它就可以了:
#include<iostream>
using namespace std;
class Number {
public:
Number operator++ (); // prefix ++
Number operator++ (int); // postfix ++
int value() { return value_; }
void setValue(int value) { value_ = value; }
private:
int value_;
};
Number Number::operator++ () {
++value_;
return *this;
}
Number Number::operator++ (int unused) {
Number temp;
temp.setValue(value_);
++value_;
return temp;
}
int main()
{
Number someNum;
someNum.setValue(20);
cout << "someNum : " << someNum.value() << "\n";
someNum++;
++someNum;
cout << "someNum : " << someNum.value() << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我假设我只需要更好地理解参考变量.任何人都可以解释为什么前缀运算符应该编码为返回引用变量?
和...之间的不同 :
Number& Number::operator++ () {
++value_;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
和
Number Number::operator++ () {
++value_;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
是,当您使用第一个代码时,以下表达式:
++(++(++someNum));
Run Code Online (Sandbox Code Playgroud)
增加someNum
THRICE.请参阅此处的输出:http://ideone.com/y9UlY
但是,当你使用第二个时,这个
++(++(++someNum));
Run Code Online (Sandbox Code Playgroud)
someNum
只是增加!! 请参阅此处的输出:http://ideone.com/eOLdj
这是因为当你从中返回引用时operator++()
,第二个和第三个++
对所调用的同一个对象进行调用someNum
,因此它会一直递增同一个对象.但是当您按值返回时,第二个和第三个++
将对您返回的临时对象进行调用operator++()
.因此,第二次和第三次调用不会增加someNum
,而是增加在表达式结尾处被销毁的临时对象.
现在,如果临时对象被破坏,为什么要在第一时间创建呢?毕竟,它的预增量运算符,意味着临时对象和原始对象将具有相同的值.因此,良好的设计决策是,在定义预增量运算符时通过引用返回,以避免创建临时,并提高性能.
归档时间: |
|
查看次数: |
1694 次 |
最近记录: |