C++之引用

來源:互聯網
上載者:User

標籤:block   數組名   out   題解   規則   對象   傳遞   cpu   fun   

目錄

  • C++之引用
    • 1、什麼是引用
    • 2、為何引入引用
    • 3、引用的規則
    • 4、變數的引用及舉例
    • 4.3、陣列變數的引用
    • 5、常引用及舉例(關鍵字const)
C++之引用1、什麼是引用

引用,就是為一個事物(變數、資料類型)起一個別名。實際中變數名它本身是一段記憶體的引用,即為該段記憶體起了一個名稱,該段記憶體的名稱 = 定義的變數名。

2、為何引入引用
  • C++引入引用後,取代了指標傳遞參數的問題,引用就是完完全全相等的值傳遞。
  • C裡面參數的傳遞是通過指標,當實參是數組時,此時用指標傳遞形式參數時,其實指標已經退化。(詳解陣列變數的引用)。
3、引用的規則

3.1 、 引用是一種關係型聲明,而非定義。不能獨立存在,必須初始化,且與原類型保持一致, 且不分配記憶體。

  //錯誤寫法                //正確寫法  int a;                  int a;  int &mya;               int &mya = a; //引用本質是聲明,不能先定義,後賦值。

3.2 、 引用聲明關係,一經聲明,不可變更。

  //錯誤寫法                //正確寫法  int a,b;                int a,b;  int &mya = a;           int &mya = a;  int &mya = b;           int &myb = a;

3.3 、 引用可再次引用,多次引用的結果是某一變數具有多個別名, 多個別名間是平行關係。

  int a;          int &mya = a;  int &myaa = a;    

3.4 、 辨別引用與其它, &前有資料類型時或&在賦值號=左邊即為引用,其它皆為取地址或按位與。

4、變數的引用及舉例

4.1、 一般變數的引用

  int a;          int &mya = a;  //此時操作mya完全就是操作a

4.2、指標變數的引用

  int *p;  int * &myp = p;

存在問題:引用的指標是否存在?

  //不存在下列寫法  int *p;  int * &myp = p;       //myp是一個指標的引用  int & * prp = &myp;  //&myp是指引用的地址  引用的本質是指標, C++對裸露的記憶體位址(指標)作了一次封裝。又取得了指標的優良特性。所以再對引用取地址,建立引用的指標無意義。

4.3、變數的多次引用

  //即為一個變數起多個別名  int a;          int &mya = a;  int &myaa = a;
  • . 存在問題:引用的引用是否存在?
//不存在下列寫法int a;int & rz = a;int && rrz = rz; 
4.3、陣列變數的引用
#include <iostream>using namespace std;void fun(int (&data)[3]){    printf("sizeof(ra) = %d\n",sizeof(data));  //輸出:12}void fun1(int *const &data){    printf("sizeof(pr) = %d\n",sizeof(data)); //輸出:4}int main(){    int array[3];    fun(array);    fun1(array);    return 0;}

總結:數組引用的形參的兩種表現形式

  • int (&data)[3] //數組引用的標準形式值傳遞,sizeof(data) = 4*3=12。
  • int *const &data //其實已經退化為指標的引用,sizeof(data) = 4。

1、這裡必須要加const,因為數組名是一個const的類型;
2、當數組引用時不能運算元組的引用名稱如:data = 2;
3、因為引用data是const類型的,只能操作引用內容:data[x] = 2。

存在問題:引用數組是否存在?
問題解析:不存在引用數組,引用只是聲明,在記憶體中不分配記憶體,而數組是要分配記憶體的,這與引用的定義不符。
int &a[2] = {a,b} //錯誤寫法。

5、常引用及舉例(關鍵字const)

概念:const 的本意,即不可修改。所以const變數或者對象,只能聲明為 const 引用,使其語義保持一致性。

1、 non-const變數或者對象,既可以聲明為 const 引用,也可以聲明為 no-const引用。聲明為 const 引用,則不可以通過 const 引用修改資料。

//non-const引用int data;int &rd = data;rd = 5;//const引用int data;const int &rd1 = data;//rd = 6; 聲明為 const 引用,則不可以通過 const 引用修改資料。

2、const變數或者對象必須聲明為const引用。

    const int val = 10;    int & rv = val; //錯誤寫法    const int & rv2 = val; //正確寫法

5.1、臨時對象的常引用

臨時對象:通常不可以取地址的對象,Cpu在運行計算中產生的中間變數,通常也稱為右值。常見臨時對象有常量,運算式等。

#include <iostream>using namespace std;//臨時變數 即不可取地址的對象#include <iostream>using namespace std;//臨時變數 即不可取地址的對象//常量 運算式 函數傳回值 類型不同的變數int foo(){    int a = 100;    return a;}int main1(){    //常量    const int & cc = 55;    cout<<cc<<endl;    //運算式    int a = 3; int b = 5;    const int &ret = a+b;    //函數傳回值    const int& ra = foo();    //類型不同的變數    double d = 100.12;    const int &rd = d;    }int main1(){    //常量    const int & cc = 55;    cout<<cc<<endl;    //運算式    int a = 3; int b = 5;    const int &ret = a+b;    //函數傳回值    const int& ra = foo();    //類型不同的變數    double d = 100.12;    const int &rd = d;    return 0;}   
  • 常引用的本質
#include <iostream>using namespace std;int main(){    double d = 3.14;    const int & rd = d;           cout<<"d = "<<d<<endl;        cout<<"rd = "<<rd<<endl;    d = 4.14;    cout<<"d = "<<d<<endl;    cout<<"rd = "<<rd<<endl;    return 0;}輸出結果:    3.14     3    4.14     3

存在問題:為何臨時變數都改變了,引用變數的內容還保持第一次的值?
問題解析:本質上 const 引用,引用了一個不可改變的臨時變數, const int tmp = data;const int &rd = tmp; 此時,我們改變了 data 的值,臨時變數的值也不會改變。

C++之引用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.