引用用于函数的参数
把函数的形参声明为引用,调用函数的时候,形参将成为实参的别名。
这种方法也叫按引用传递或传引用。(传值、传地址、传引用只是说法不同,其实都是传值。)
引用的本质是指针,传递的是变量的地址,在函数中,修改形参会影响实参。
1)传引用的代码更简洁。
2)传引用不必使用二级指针。
3)引用的属性和特别之处。
引用的形参和const
如果引用的数据对象类型不匹配,当引用为const时,C++将创建临时变量,让引用指向临时变量。
什么时候将创建临时变量呢?
l 引用是const。
l 数据对象的类型是正确的,但不是左值。
l 数据对象的类型不正确,但可以转换为正确的类型。
结论:如果函数的实参不是左值或与const引用形参的类型不匹配,那么C++将创建正确类型的匿名变量,将实参的值传递给匿名变量,并让形参来引用该变量。
将引用形参声明为const的理由有三个:
l 使用const可以避免无意中修改数据的编程错误。
l 使用const使函数能够处理const和非const实参,否则将只能接受非const实参。
l 使用const,函数能正确生成并使用临时变量。
左值是可以被引用的数据对象,可以通过地址访问它们,例如:变量、数组元素、结构体成员、引用和解引用的指针。
非左值包括字面常量(用双引号包含的字符串除外)和包含多项的表达式。
引用用于函数的返回值
传统的函数返回机制与值传递类似。
函数的返回值被拷贝到一个临时位置(寄存器或栈),然后调用者程序再使用这个值。
double m=sqrt(36); // sqrt()是求平方根函数。
//sqrt(36)的返回值6被拷贝到临时的位置,然后赋值给m。
cout << sqrt(25);
//sqrt(25)的返回值5被拷贝到临时的位置,然后传递给cout。
如果返回的是一个结构体,将把整个结构体拷贝到临时的位置。
如果返回引用不会拷贝内存。
语法:
返回值的数据类型& 函数名(形参列表);
注意:
l 如果返回局部变量的引用,其本质是野指针,后果不可预知。
l 可以返回函数的引用形参、类的成员、全局变量、静态变量。
l 返回引用的函数是被引用的变量的别名,将const用于引用的返回类型。