C++中,&符號作為別名的意義

在C++的開發中,我們知道,要給一個變量取別名的語法是Type& name = var,此時需要修改變量指向的空間,除了用變量直接修改,還可以通過指針,另外一個就是使用別名修改(C++中引用)。

下面設定了ABCDEF測試函數:

  • int getA() 作為是最常見的函數形式,直接將數值返回 int。
  • int& getB() 的返回值int&,此時可以用一個變量取把地址別名在主調函數中接收過來。
  • int& getC() 的返回值是int&(與B相同),此時我們返回的是內存塊的別名,別名作為左值可以對其內容進行操作。但是沒有辦法作為右值賦值,不能返回局部變量的引用。主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態。
  • int getD()int& getE()和上面的解釋一致,只不過是在函數體內聲明了一個static的標識符,代表該變量是靜態的不需要重復賦值,有自己的內存區域,函數消失后不會自動銷毀。
#include "iostream"

using namespace std;

int getA(){
    int a;
    a = 10;
    return a;
}


int& getB(){
    int a;
    a = 10;
    return a;
}

int& getC(){
    int a;
    a = 10;
    return a;
}

int getD(){
    static int a = 10;
    a ++ ;
    printf("a: %d \n",a);
    return a;
}

int& getE(){
    static int a = 10;
    a ++ ;
    printf("a: %d \n",a);
    return a;
}

int* getF(){
    static int a = 10;
    a ++ ;
    printf("getF::a: %d \n",a);
    return &a;
}

int main(){

    int a = 10;//此處a的意思實際上是內存空間的別名,分配了4個字節的內存
    int &b = a;//在這里起一個別名, 語法為: Type& name = var;
    b = 20;//間接修改了a
    printf("a:%d \n",a);

    {
        int *p = &a;
        *p = 12;
        printf("a:%d \n",a);
    }

    int a1 = 0;
    int a2 = 0;
    a1 = getA();
    a2 = getB();
    int &a3 = getC();

    //& 表示取該變量的別名
    int &a4 = a1;
    a4 = 30;

    //  此處相當于返回一個 11 這個時候是沒有辦法進行賦值的: 11 = 100;僅僅是一個數值,沒有內存地址
    //getD() = 100;

    //此處是相當于返回了一個 開辟了內存空間的變量地址,是允許需改內容的: a = 100;
    //但被調用的函數當作左值的時候,必須返回一個引用
    getE() = 100;


    //該代碼在C的編譯器下是無法通過的 需要改寫成   *(a1 > a2 ? &a1 : &a2) = 100;才能在C的編譯器下通過
    //但是該代碼在C++編譯器下是沒有問題的,已經做了內部優化
    (a1 > a2 ? a1 : a2) = 100;

    printf("a1: %d \n",a1);
    printf("a2: %d \n",a2);
    printf("a3: %d \n",a3);

    //此處是手工打造改變內存空間的條件
    *(getF()) = 100;
    getF();

    system("pause");

    return 0;
}

C++ 引用的作用和用法

網上摘抄了一段覺得非常好的總結,如下:

引用的好處之一就是在函數調用時在內存中不會生成副本。

引用總結

  1. 在引用的使用中,單純給某個變量取個別名是毫無意義的,引用的目的主要用于在函數參數傳遞中,解決大塊數據或對象的傳遞效率和空間不如意的問題。

  2. 用引用傳遞函數的參數,能保證參數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。

  3. 引用與指針的區別是,指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。

  4. 使用引用的時機。流操作符<<和>>、賦值操作符=的返回值、拷貝構造函數的參數、賦值操作符=的參數、其它情況都推薦使用引用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容