首先定義類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
咱們看到賦值構造函數返回值爲非引用類型時,致使系統爲其拷貝生成兩個臨時變量
雖然最後達到的目的一致,可是增長了內存開支