请教一下C++重载赋值操作符为什么要做一个this判断?
今天看书上说:“赋值操作符重载比拷贝构造函数做得要多。它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。” 然后书上有一个例子:
class Widget
{
private:
int *pointer;
public:
Widget (int i = 0) { pointer = new int(i); }
void fix (int i) { *pointer = i; }
void print() { cout << *pointer << endl; }
Widget& operator = (const Widget &wgt); // 重载赋值操作符。
};
Widget& Widget:: operator = (const Widget &wgt) // 重载赋值操作符。
{
if (this != &wgt) // 请问这个this判断的意义是什么???
*pointer = *(wgt.pointer);
return *this; // 请问这个返回的是什么?class Widget它自己类的引用吗?
}
int main()
{
Widget wgt1(9), wgt2; wgt2 = wgt1;
wgt1.fix(10); wgt2.print(); // 结果是9。
return 0;
}
请问一下那个this判断的意义是什么?难道还能出现相反的情况吗即(this==&wgt)?另外"return *this"返回的是什么?它自己类的引用吗?
另外书上又说:“为了防止默认拷贝发生,可以将拷贝构造函数和重载赋值运算符设为private来禁止拷贝。只是声明,不用实现。”
class Widget
{
private:
Widget(const Widget&);
Widget& operator = (const Widget&);
public:
int* p;
};
请问一下“设为private来禁止拷贝”到底是什么意思?设为private之后,还能在main里调用赋值操作符重载吗?
谢谢了先!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
if (this != &wgt)
通过地址判断是否是自己赋值给自己if (this != &wgt)
,则修改了pointer 的内容,即某种程度上做了深copy这个其实很简单,就是比较是这个本身,如果不是,才进行操作。否则就不用进行操作了。
因为自己赋值给自己在语言规则里是合法的。
为了减轻负担,你就可以先判断一下是不是自己赋值给自己。
这个在比较操作里一般也是有的。
看了学习一下 很不错