1. 程式人生 > >【C++】引用那些事(1)

【C++】引用那些事(1)

一、什麼是引用? 

引用不是新定義一個變數,而是給已存在變數取了一個別名,編譯器不會為引用變數開闢記憶體空間,它和它
引用的變數共用同一塊記憶體空間

比如:李逵,在家稱為"鐵牛",江湖上人稱"黑旋風"。

型別& 引用變數名(物件名) = 引用實體;

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定義引用型別
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

在這裡,a和ra其實指向同一空間,它們的地址是一樣的,所以,ra相當於a的別名。 

注意:引用型別必須和引用實體同種型別

 

二、特點:

1. 引用在定義時必須初始化!!!

void TestRef()
{
  int a = 10;
  // int& ra; // 該條語句編譯時會出錯
  int& ra = a;
  int& rra = a;
  printf("%p %p %p\n", &a, &ra, &rra);
}

2. 一個變數可以有多個引用

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定義引用型別
  int& rra=ra;
  int& rrra=rra;
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

3. 引用一旦引用一個實體,再不能引用其他實體

void TestRef()
{
  int a = 10;
  int& ra = a;//<====定義引用型別
  int b = 100;
  ra = b;//這句程式碼是指把b賦值給ra,引用是從一而終的,一旦引用就定了,不能在引用別的變數
  printf("%p\n", &a);
  printf("%p\n", &ra);
}

三、常引用 

下圖程式碼裡,a,b都是 const 型別的,所以必須用 const 的引用 。在引用時,許可權可以縮小,不可以放大。

void TestConstRef()
{
   const int a = 10;
   //int& ra = a; // 該語句編譯時會出錯,a為常量,具有常屬性,不可修改
   const int& ra = a;

   // int& b = 10; // 該語句編譯時會出錯,b為常量
   const int& b = 10;

   int c =20;
   const int& rc = c;//正確

   double d = 12.34;
   //int& rd = d; // 該語句編譯時會出錯,在編譯時,d先給一個臨時變數,臨時變數再給rd,但是該臨時變數具有常屬性,即不可修改,所以錯誤
   const int& rd = d;//加上const即正確
}

四、引用的作用(使用場景)

1.做引數

void Swap(int& left, int& right)
{
  int temp = left;
  left = right;
  right = temp;
}

2.做返回值

int& TestRefReturn(int& a)
{
   a += 10;
   return a;
}

注意:如果函式返回時,離開函式作用域後,其棧上空間已經還給系統,因此不能用棧上的空間作為引用型別返回。如果以引用型別返回,返回值的生命週期必須不受函式的限制(即比函式生命週期長)。