C/C++ - 類中成員變量是引用


C++引用

引用在定義時必須初始化,否則編譯時便會報錯。如果類(自定義類型)的成員是引用類型,需要注意一些問題。

引用成員變量 並不為這個變量新辟空間;類對象做成員變量則是要對其新辟一段空間的

不能有默認構造函數,必須提供構造函數

凡是有引用類型的成員變量的類,不能有缺省構造函數。默認構造函數沒有對引用成員提供默認的初始化機制,也因此造成引用未初始化的編譯錯誤。

構造函數的形參必須為引用類型

暫時還不知道該怎么解釋,牽涉到引用的機制。

初始化必須在成員初始化鏈表內完成

不能直接在構造函數里初始化,必須用到初始化列表,且形參也必須是引用類型。構造函數分為初始化計算兩個階段,前者對應成員初始化鏈表,后者對應構造函數函數體。引用必須在初始化階段,也即在成員初始化鏈表中完成,否則編譯時會報錯(引用未初始化)。

成員引用示例

#include <iostream>

using namespace std;

class Ref
{
    public:
        // 構造函數形參為傳值,不能保證正確性
        // Ref (int target) :myref(target) {
            // cout << "Ref constructor" << endl;
        // }

        // 函數體對引用賦值,編譯錯誤:引用未初始化
        // Ref (int &target)  {
            // myref = target;
            // cout << "Ref constructor" << endl;
        // }

        // 如果成員為變量為引用類型,那么構造函數的參數為應用類型
        // 引用必須在成員初始化鏈表里面初始化,不能在函數體里面初始化
        // 在函數體里面修改myref,相當於賦值,顯然引用不能賦值
        Ref (int &target) :myref(target) {
            cout << "Ref constructor" << endl;
        }

        void printRef() {
            cout << "myref is: " << myref << endl;
        }

        virtual ~Ref () {}

    private:
        int &myref;
        /* data */
};

int main(int argc, char *argv[])
{
    int a = 20;
    Ref r(a);
    r.printRef();

    int &b = a;
    Ref r1(b);
    r1.printRef();

    // error:引用定義時必須初始化
    // int &c;

    return 0;
}

  

文章來自:http://blog.csdn.net/lazyq7/article/details/48186291#不能有默認構造函數必須提供構造函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM