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++很多操作符都是可被重载的,而且其优先级不变。可以利用这一点来验证你的问题:
代码:
输出结果:
构造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++中的运算符重载,应该不陌生。
详细解释下面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++中的运算符重载,应该不陌生。