引用拷貝構(gòu)造賦值語句

1、引用

成都創(chuàng)新互聯(lián)公司成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對公司的主營項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計、行業(yè) / 企業(yè)門戶設(shè)計推廣、行業(yè)門戶平臺運(yùn)營、重慶App定制開發(fā)、成都做手機(jī)網(wǎng)站、微信網(wǎng)站制作、軟件開發(fā)、資陽移動機(jī)房等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從成都創(chuàng)新互聯(lián)公司可以獲得的服務(wù)效果。

  C++中有一種新的數(shù)據(jù)類型,對已開辟空間在取一個名字;

引用 拷貝構(gòu)造 賦值語句

  就是別名,不開辟新的空間,沒有空引用;

  例:int &b; 錯誤,

  交換兩個數(shù)字用引用實(shí)現(xiàn):

引用 拷貝構(gòu)造 賦值語句

常見的幾種引用形式:

  (1)、對變量引用:int a = 10;

      int &b = a;

  (2)、對指針引用:int *p = &a;

      int *&q = p;

  (3)、對數(shù)組引用:int ar[3] = {1, 2, 3,};

      int (&b)[3] = ar;

此外還有以下類型的引用:

  (1)、常引用 const int x = 100;

  int &y = x;        錯的,非常量的不能引用常量,只有自己也加上const成為常量才可以引用。

  常量只能常引用;

  (2)、int n = 20;

  const int &m = n;   對的,常量引用非常量可以,因?yàn)槟憧梢愿淖?,我要求自己不能改變而已?/p>

  變量也可以常引用;

 (3)、 const double d = 12.34;

  const int &f = d;    對的,此時d和f由于不是同一種數(shù)據(jù)類型,所以地址不一樣,此時f引用的不是真實(shí)的d,而是對產(chǎn)生的臨時變量的引用(此時會把整數(shù)截取);

  (4)、double d = 12.34;

  int &f = d;   錯的,臨時變量一般都具備常量的性質(zhì)我們往往在類型轉(zhuǎn)換時所產(chǎn)生的中間臨時變量具備常量的性質(zhì);所以要加const,對常量的引用,


引用 拷貝構(gòu)造 賦值語句

加上const后,常引用對常量,因?yàn)橹虚g的臨時變量都是常量(在類型轉(zhuǎn)換時會產(chǎn)生中間的臨時變量);只要類型不同,就都會轉(zhuǎn)換;

引用 拷貝構(gòu)造 賦值語句

2、拷貝構(gòu)造函數(shù)

 (1)、對象初始化對象,調(diào)用拷貝構(gòu)造函數(shù)。

Test(const Test &t){}

  因?yàn)榭截悩?gòu)造函數(shù)也是構(gòu)造函數(shù),所以和類名相同。

  const只是為了保護(hù)t不被更改;

  &必須加上,因?yàn)?Test t(t1);此時相當(dāng)于t1給t初始化,調(diào)用拷貝構(gòu)造函數(shù),將陷入無窮的遞歸當(dāng)中,所以要使用引用;

  (2)、拷貝構(gòu)造函數(shù)系統(tǒng)會有默認(rèn)的,按其成員進(jìn)行拷貝!

  (3)、調(diào)用拷貝構(gòu)造函數(shù)的三種場合: 

  a、初始化對象時,Test t(t1); 和 Test t = t1;

  b、形參實(shí)參傳遞時

  c、返回值為對象時,會創(chuàng)建一個無名的臨時變量,(此時相當(dāng)于對象給對象賦值),返回的是一個新的匿名對象;

3、賦值語句

  賦值語句系統(tǒng)也有默認(rèn)的,是各成員之間相互賦值。

void operator=(const Test t);

  賦值語句在對象賦值時調(diào)用,可以說是對=的重載;

  此時const只是為了保護(hù)不被修改,t調(diào)用拷貝構(gòu)造函數(shù)(對象給對象初始化賦值),但是為了時間和空間的效率,此處用引用更好;

void operator=(const Test &t);

此時不能連等賦值,t = t1 = t2;   這個的本質(zhì)就是:t.operator=(t1.operator=(t2));

所以的有返回值呀,

Test& operator=(const Test &t){
  if(this != &t){
   data = t.data;
  }
    
  return *this;   
}

因?yàn)椴皇莿?chuàng)建臨時無名對象,所以可以引用返回;臨時的不行,返回時空間就已經(jīng)析構(gòu)了。

適用場合:Test t;  t = t1 =t2 = t3;(對象已經(jīng)初始化過了,此時就叫做賦值);

4、函數(shù)的優(yōu)化調(diào)用:

#include<iostream>
using namespace std;
class Test{
public:
    Test(int d = 0) : data(d){
        cout<<"Create Test Object"<<this<<endl;
    }
    Test(const Test &t){
        cout<<"Copy Create Test Object"<<this<<endl;
        data = t.data;
    }
    Test& operator=(const Test &t){
        cout<<"Assign : "<<this<<endl;
        if(this != &t){
            data = t.data;
        }
        return *this;
    }
    ~Test(){
        cout<<"Free Test Object"<<endl;
    }
public:
    int GetData()const{
        return data;
    }
private:
    int data;
};
Test fun(Test x){
    int value = x.GetData();
    Test tmp(value);   //創(chuàng)建臨時tmp對象,調(diào)用構(gòu)造函數(shù)
    return tmp;        //返回值為對象,調(diào)用拷貝構(gòu)造,借助中間橋梁返回;
}                      //立馬先析構(gòu)tmp和x臨時對象,在進(jìn)行賦值語句,最后析構(gòu)其他對象;  
int main(void){
    Test t1(100);     //創(chuàng)建對象t1,調(diào)用構(gòu)造函數(shù)
    Test t2;          //創(chuàng)建對象t2,調(diào)用構(gòu)造函數(shù)
    t2 = fun(t1);     //形參,實(shí)參傳遞,調(diào)用拷貝構(gòu)造
    return 0;
}

引用 拷貝構(gòu)造 賦值語句

優(yōu)化以上的代碼,使節(jié)省空間和時間:

Test fun(Test &x){
    int value = x.GetData();
    return Test(value);  //創(chuàng)建臨時無名對象,編譯器直接認(rèn)為:直接就是這個t2對象
}

int main(void){
    Test t1(100);      //創(chuàng)建對象t1
    Test t2 = fun(t1); //不用再調(diào)用賦值語句;

    return 0;
}

引用 拷貝構(gòu)造 賦值語句

效率最低-->代碼的優(yōu)化。

本文名稱:引用拷貝構(gòu)造賦值語句
當(dāng)前網(wǎng)址:http://muchs.cn/article10/ihiigo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名、關(guān)鍵詞優(yōu)化域名注冊、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)