C++primer 练习题6.13

C++primer 习题6.13
详细解释下面while循环中的语句是如何执行的:
*dest++=*source++;

答案的说法是:1.指针dest加1;2.指针source加1;3.将source原来所指向的对象赋给source原来所指向的对象。

疑问:++的优先级比*的优先级高,而且结合顺序是从右至左。  不是应该是dest加1,source加1吗?
为什么是指针加1?

------解决方案--------------------
C++很多操作符都是可被重载的,而且其优先级不变。可以利用这一点来验证你的问题:
代码:

#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++
------解决方案--------------------
应该是,先后++,得到一个临时值(就是变量当前地址),取其地址内容,然后变量地址后移一单位。
如果做过,C++中的运算符重载,应该不陌生。