引用必须初始化。由于引用一经定义,它就不能再指向其余对象了,因此须要进行初始化。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