首先定义类Person函数
class Person{ public: string name; Person()=default; //默认构造函数 Person(string nam):name(nam){} void operator=(const Person& p){ //赋值构造函数 this->name=p.name; } }; Person a("xiaoming"); Person b; cout<<b.name<<endl; //空 b=a;//执行赋值构造函数 cout<<b.name<<endl; //xiaoming
由上,赋值操做已完成,可为何赋值构造函数还有个返回值this
其实只要把b=a 当作是 a.operator=(b)就能够了spa
b=a的返回值就至关于a.operator=(b)这个函数的返回值.net
好比code
咱们来修改赋值构造函数返回值为一个具体的整数100对象
int operator=(const Person& p) { this->name = p.name; return 100; } cout<<10+(b=a)<<endl; // 110
结果,(b=a)产生了一个临时变量100,而后这个临时变量和10相加得结果110,这个临时变量就是咱们所谓的返回值blog
可让对象进行链式操做内存
好比咱们将返回值更改成这个对象的引用get
Person& operator=(const Person& p) { this->name = p.name; return *this; } Person& showName() { cout<<this->name; return *this; } (b=a).showName(); //xiaoming
咱们在给b赋值之后还能再让其还能再执行函数showNamestring
区别固然大了
首先新建一个对象c
Person c("huanghuang");
(b=a)=c;
cout<<b.name<<endl; //huanghuang
(b=a)=c;
cout<<b.name<<endl; //xiaoming
能够看到结果不一样,究其缘由,第2)种状况让系统拷贝了一份临时变量,于是是c给临时变量赋值,而非对象b
表一 结果对比表
返回值类型 (b=a)执行后产生的结果
Person& b的引用
Person b的一份拷贝(临时变量)
扩展阅读:
临时变量又叫作右值,左值就是非临时变量
详细解释:( http://www.javashuo.com/article/p-dqyvolzx-gu.html https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ https://blog.csdn.net/zhangsj1007/article/details/79940370【三篇关于左值右值的讲解】)
粗糙解释:就是在执行某段代码中间产生的临时变量,这个临时变量在执行完这段代码后就会被析构,除非你引用了这个临时变量。
//若是返回值类型不为引用 产生了临时变量 咱们引用这个临时变量
Person&& d=b=a;
Person&用于引用一个已经被定义好的Person对象
Person&&则是用于引用一个临时的Person对象(认领这块无主之地)
即a=b=c
首先咱们增长一个拷贝构造函数 再给赋值构造函数增长一个输出
Person(const Person&p) { cout<<"copy constructor"<<endl; } Person& operator=(const Person& p) { cout << "copy assignment constructor" << endl; this->name = p.name; return *this; }
a=b=c;
1)赋值构造函数返回值为引用类型
copy assignment constructor
copy assignment constructor
2)赋值构造函数返回值为非引用类型
copy assignment constructor
copy constructor
copy assignment constructor
copy constructor
咱们看到赋值构造函数返回值为非引用类型时,致使系统为其拷贝生成两个临时变量
虽然最后达到的目的一致,可是增长了内存开支