引用必須初始化。由於引用一經定義,它就不能再指向其餘對象了,因此須要進行初始化。git
type & quote_name=var_name;
但引用不能用引用對象的地址進行初始化。若是想對對象的地址進行引用,能夠定義一個指針引用。github
int a=10; int &b=a;
這裏,b就是一個引用,b實際上指向的是a的地址,但它不是指針,是引用,是a的別名,a能作的b都能作。函數
實際應用中,引用主要被用來做爲函數的形式參數。
引用在內部存放的是一個對象的地址,它是該對象的別名。對於不可尋址的值,如字符串常量,以及不一樣類型的對象,編譯器爲了實現引用,必須生成一個臨時對象,引用實際上指向該對象,但用戶不能訪問它。這時當引用用來做爲函數形參時就引入了const引用問題。指針
double dvar=2.12; int & nvar=dvar; //Wrong int const& cnvar=dvar; //OK double & cdqvar=dvar+1.0; //Wrong double const& cdqvar=dvar+1.0; //OK
double dvar=2.12; int const& cnvar=dvar; ///編譯器轉換--Beg int tmp=dvar; //double -> int int const& cnvar=tmp; ///End
int nvar=100; int * &pqvar=&nvar; //Wrong , &nvar 產生了一個臨時的對象,引用必須爲const int * const & pcqvar=&nvar; //OK int const nvar0=100; int * &pqref=&nvar0; //Wrong, 非const引用是非法的 int const * &pcqref=&nvar0; //Wrong, 須要臨時變量,且由於nvar0是一個常量,因此須要一個常量指針,以確保不能修改nvar0的值,而pcqref是一個很是量指針 int const * const &cpcqref=&nvar0; //OK int const *p = &nvar0; int const * &ref = p; //OK
注:常量指針和指針常量code
int a; int * const p = &a //指針常量,*p能夠修改:*p = 8;(OK) //p不能夠修改: p++;(ERROR) int a,b; const int *p = &a; //常量指針,*p不可修改:*p = 8;(ERROR) //p 能夠修改: p = &b (OK)
總結:對象
int nvar=100; int const &ref=nvar; nvar++; //OK //ref++; //Wrong cout<<nvar<<endl<<ref<<endl; ///輸出: 101 101