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#不能有默認構造函數必須提供構造函數