64,651
社区成员
发帖
与我相关
我的任务
分享
#include <string>
using namespace std;
class Number
{
private:
string name;
public:
Number(const string& name)
{
cout<<"构造"<<name<<endl;
this->name = name;
}
// 后递增的操作符重载方法必须定义一个无用的int参数
Number operator ++(int)
{
cout<<"{"<<name<<"} Number::operator++"<<endl;
return Number(name + "Copy");
}
Number& operator=(const Number& rhs)
{
cout<<"{"<< name<<"} Number::operator="<<endl;
return *this;
}
Number& operator*()
{
cout<<"{"<< name<<"} Number::operator*"<<endl;
return *this;
}
};
int main() {
Number dest("dest"), source("source");
*dest++ = *source++;
return 0;
}
输出结果:
构造dest
构造source
{source} Number::operator++
构造sourceCopy
{sourceCopy} Number::operator*
{dest} Number::operator++
构造destCopy
{destCopy} Number::operator*
{destCopy} Number::operator=
从该结果可以得到以下结论:
1.由于赋值操作符的结合顺序是从右到左,所以先执行的是它右边的表达式计算,即(*source++)
2.由于++(后递增)比*(解引用)优先级高,所以先执行的是++,然后再解引用
3.虽然dest加了1,(source也加了1),但由于C++的标准来说,后递增必须返回一个数据的副本,而不是数据本身,而该副本通常保留了执行递增操作前的数据内容。所以,虽然source和dest都进行了+1操作,但因为返回的副本对象实际上保留的是之前的数据。
4.书上的标准答案并不严谨。首先执行的应该是source++