1. 程式人生 > >C++之引用

C++之引用

() 關系型 tmp 內存地址 指針變量 返回 分配內存 多次 amp

目錄

  • 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++之引用