首页 > 代码库 > effective C++ 读书笔记 条款10
effective C++ 读书笔记 条款10
条款10: 令operator= 返回一个reference to *this;
关于赋值,我们可以这样写:
int x,y,x;
x =y = z;
这就是所谓的连续赋值
为了实现“连锁赋值”赋值操作符必须返回一个reference指向操作符的左侧实参。这是我们为class实现赋值操作符时应该遵循的协议:
#include <iostream>using namespace std;class Widget{public: Widget() { cout<<"调用无参构造函数"<<endl; } Widget(const Widget& w) { cout<<"调用拷贝构造函数"<<endl; } ~Widget() { } Widget& operator=(const Widget& rhs) //返回类型是个reference 指向当前对象 { cout<<"Hello"<<endl; return *this; //返回左侧对象 } Widget& operator +=(const Widget& rhs) //这个协议也适用于+=,-=,*=等等 { return *this; }};int main(){ Widget w1; Widget w2; Widget w3; w1 = w2 = w3; return 0;}
上面说赋值操作符必须返回一个reference,我以前也是认为如果要连续操作,就必须返回引用,但是我用返回一个对象试着运行了一下,
程序也会通过,并且在这个operator= 中还能得到一模一样的效果:
经过研究发现,并非一定要返回引用,返回值对象时会增加拷贝构造函数和析构函数的调用,所以一般都是返回引用;
#include <iostream>using namespace std;class Widget{public: Widget() { cout<<"调用无参构造函数"<<endl; } Widget(const Widget& w) { cout<<"调用拷贝构造函数"<<endl; } ~Widget() { } /* Widget& operator=(const Widget& rhs) //返回类型是个reference 指向当前对象 { cout<<"Hello"<<endl; return *this; //返回左侧对象 } */ Widget operator=(const Widget& rhs) { cout<<"Hello"<<endl; return *this; } };int main(){ Widget w1; Widget w2; Widget w3; w1 = w2 = w3; return 0;}/*1:调用返回引用:调用无参构造函数调用无参构造函数调用无参构造函数HelloHello2:调用返回对象调用无参构造函数调用无参构造函数调用无参构造函数Hello调用拷贝构造函数Hello调用拷贝构造函数Press any key to continue*/
effective C++ 读书笔记 条款10
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。