C++ 賦值構造函數的返回值到底有什麼用?且返回值是否爲引用類型有什麼區別嗎?

首先定義類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爲何會產生返回值)

首先b並不接收返回值(b=a讓某些初學者誤認爲b接受返回值)

其實只要把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

那返回值是引用類型和非引用類型有區別嗎?

區別固然大了

1.對一個對象進行兩次連續的賦值操做

首先新建一個對象c

Person c("huanghuang");

1)賦值構造函數返回值是引用類型

(b=a)=c;
cout<<b.name<<endl; //huanghuang
 
 

2)賦值構造函數返回值不是引用類型

 
 
(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對象(認領這塊無主之地)

2.將一個對象連續賦值給兩個對象

即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

咱們看到賦值構造函數返回值爲非引用類型時,致使系統爲其拷貝生成兩個臨時變量

雖然最後達到的目的一致,可是增長了內存開支

 

綜上,複製構造函數的返回值爲引用類型比較好,在給多個對象賦值時,能夠節省內存開支,在進行鏈式操做時,不但能夠節省內存開支,還能夠對其進行修改性操做

相關文章
相關標籤/搜索