c++引用变量
1.引用基本的概念
int& a = b;
指创建了一个 指向int的引用a,a是复合类型 int& ;(类似指针也是符合类型 int*)
a指向b,即a是b的别名;
必须在声明时就将引用初始化,不能先声明再初始化;(c++ pp page 211)
2.常量引用 const int &
在引用做函数的形参时,如果不像函数对实参进行修改,就用常量引用做形参(c++ pp page 215)
double refdube(const double &ra);
3.当且仅当函数的形参类型为const 引用时,如果实参与形参不匹配,c++将生成临时变量。
否则,若形参类型不为const 引用且实参与形参不匹配,则警告或报错。(c++ pp page 215)
应尽可能的在函数形参类型上使用const引用,因为
const引用的形参类型可以接收const和非const实参;而普通引用类型不能接收const实参;
---------------------------------3/17------------------------------
如果数据类型本身并不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针。p183
此外,对于引用做参数也是该情况:const引用做形参可以处理常量和非常量实参,普通引用做形参只能处理非const实参。p216
即const做形参优势可以体现在指针和引用两个方面。
---------------------------------------------------------------------
此外,使用const引用类型还可以创建临时变量;
可以避免无意中修改实参变量的数据;(c++ pp page 216)
4.使用引用做形参、返回值的效率更高,因为不用copy原始数据的副本;
但注意,返回值使用引用类型时,注意不能返回一个指向临时变量的引用,这样会引发错误:(c++ pp page 219)
const int & clone(int & a) { int b; b = a; return b; }
该函数返回一个指向临时变量 b 的引用,函数运行完毕后其将不再存在。
5.基类引用可以指向派生类对象。(c++ pp page 223)
6.右值引用(c++ pp page 216)
void stove(double && r){...}
void stove(const double & r){...} int main() { double x = 1.5; double y = 2.5; stove(x+y);//calls void stove(double && r){...} }
上述代码中,如果没有定义void stove(double && r){...},stove(x+y) 将调用 void stove(const double & r){...}(则将生成临时变量,常量引用形参r指向该临时变量,具体见本文第三点 和c++ pp page 228)。
左值参数是可被引用的数据对象,例如变量、数组元素、结构成员、引用和解除引用的指针都是左值;
现在常规变量和const变量都可视为左值;
非左值包括字面常量(用引号括起的字符串除外,它们由其地址表示)和包含多项的表达式。(c++ pp page 215)