- 8.2 引用变量
C++新增的一种复合类型——引用变量。例如:若将twaim作为clement变量的引用,则可以交替使用twaim和clement(可以看作一个人名字和绰号都可以表示是这个人)。通过将变量用作参数,函数将使用原始数据,并非其副本。所以除了函数指针外,使用引用可以用来处理大型结构数据,是一种比较方便的途径。
8.2.1 创建引用变量
C++中使用&符号表示变量的地址。不仅如此,C++中给符号&增加另一种用法,将其用来声明引用。例如:将nums作为numbers变量的别名:
int numbers;
int & nums=numbers;
/*上面的&符号不是地址运算符,这个需要注意。
就类似char*指向的是指向char的指针,int&
是指向int的指针。(它们是指向同一个值和内存单元)
*/
引用刚刚接触时,看上去可能有些像指针,实际上还是不同的。除了表示上面的不同以外,还有一些差别。例如,必须在声明引用时初始化,而不是像指针那样,先声明,再赋值。
int A;
int & a;
a=A; //错误,不能这样做
PS.必须在声明引用变量时进行初始化。
引用使用起来更像是const指针,必须创建时进行初始化,与一个变量相关联后,必须绑定。
- 8.2.2 将引用用作函数参数
引用多作为函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。具体如何,如下所示:
/**********按值传递************/
void urban(int x);
int main(){
int times=10;
Zhuzhou(times);
//创建变量“times”,
//将值10赋给它
.....
}
void Zhuzhou(int x){
//创建x变量,将传递来的10的值赋给它
.....
}
/*****************************/
/*********按引用传递***********/
void valige(int &x);
int main(){
int times=10;
ZZ(times);
//创建变量“times”,
//将值10赋给它
.....
}
void ZZ(int &x){
//使x成为times的别名
.....
}
交换两个变量的值,对使用引用和使用指针做一下比较。交换函数必须能够修改调用程序中的变量的值。这样做意味按值传递变量将不管用,应为函数将交换原始变量副本的内容,而不是变量本身的内容。但是在传递引用时,函数将使用原始数据。另一种办法是使用传递指针来访问原始数据。
- 临时变量、引用参数和const
如果实参和引用参数不匹配,C++将会生成临时变量。
如果引用参数是const,则编译器将会在两种情况下生成临时变量:
- 实参类型正确,但不是左值。
- 实参类型不正确,但可以转换为正确的类型。
PS:关于左值。左值参数是可以被引用的数据对象。例如,变量、数组元素、结构成员等。非左值包括字面常量(用引号括起来的字符串除开,他们有由地址来表示的)和包含多项表达式。
对于形参为cosnt引用的C++函数而言,如果实参与类型不匹配,则其操作行为近似于按值传递,为确保原始数据不会被修改,将使用临时变量来存储值。
PS:如果函数调用的不是左值或者与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,且会让参数来引用该变量。
- *尽可能使用const*
- 使用const可以避免无意中修改数据的编程错误;
- 使用const可以使函数能够处理const和非const实参,否则将只能接受非const数据;
- 使用const引用使函数能够正确生成并使用临时变量。
>C++11 右值引用
这种引用可以指向右值,使用&&声明的:
double && ref=std::sqrt(25.00); //不允许double &
double n=15.0;
double && kaf=3.0*n+15.0; //不允许double &
std::cout<<ref<<'\n'; // 5.0
std::cout<<kaf<<'\n'; // 60.0
右值引用主要为了让库设计人员提供操作更加有效率。
<引用参数、变量,临时变量,const引用>