參考型別的使用注意

來源:互聯網
上載者:User

參考型別由類型標識符和一個取地址操作符來定義, 引用必須被初始化.

請看下面的初始化:

    double dval = 3.14159;

    extern int f();

    int  &ir1 = 1024;  // error

    int &ir2 = dval;     // error

    int &ir3 = f();         // error

上面的三個引用初始化都將導致編譯出錯. 下面做適當解釋.

實際上, 引用在內部存放的是一個對象的地址, 它是該對象的別名, 對於不可定址的值, 比如文字常量, 以及不同類型的對象, 編譯器為了實現引用, 必鬚生成一個臨時對象, 引用實際上指向該對象, 但使用者不能訪問它. 比如, 我們寫了:

    double dval = 3.14159;

     int &ir2 = dval;

由於需要類型轉換, 因此編譯器將其轉換成:

    int temp = dval;   int &ir2 = temp; // 如果這時候給ir2賦一個新值, 那麼改變的是temp, 而不是dval.

                                                               // 而temp是不可定址的. 同時 對於使用者來說, 並不想這麼做.

因此, 這種情況下, 我們需要const引用, 因為它們是唯讀, 不允許非const引用指向需要臨時對象的對象或值. 另外, 對於int &ir3 = f(), f()函數調用的傳回值也是一個臨時值, 不能被用來初始化非const型的引用.

正確的修改如下:

    const int  &ir1 = 1024;  // OK

    const int &ir2 = dval;     // OK

    const int &ir3 = f();         // OK

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.