引用的形参和const
左值是可以被引用的数据对象,可以通过地址访问它们,例如:变量、数组元素、结构体成员、引用和解引用的指针。
非左值包括:
- 字面常量(用双引号包含的字符串除外)。
- 包含多项的表达式。
引用用于函数的返回值
传统的函数返回机制与值传递类似。
函数的返回值被拷贝到一个临时位置(寄存器或栈),然后调用者程序再使用这个值。
double m=sqrt(36); // sqrt()是求平方根函数。
sqrt(36)的返回值6被拷贝到临时的位置,然后赋值给m。
cout << sqrt(25);
sqrt(25)的返回值5被拷贝到临时的位置,然后传递给cout。
如果返回的是一个结构体,将把整个结构体拷贝到临时的位置。
如果返回引用不会拷贝内存。
语法:
返回值的数据类型& 函数名(形参列表);
注意:
- 如果返回局部变量的引用,其本质是野指针,后果不可预知。
- 可以返回函数的引用形参、类的成员、全局变量、静态变量。
- 返回引用的函数是被引用的变量的别名,将const用于引用的返回类型,示例如下。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> using namespace std; const int& func2(int& ra) { ra++; cout << "ra的地址是:" << &ra << ",ra=" << ra << endl; return ra; } int main() { int a = 3; int b = func2(a); cout << "a的地址是:" << &a << ",a=" << a << endl; cout << "b的地址是:" << &b << ",b=" << b << endl; // 如果函数func2不加const限制,将导致下行代码 // func2(a) = 10; cout << "a的地址是:" << &a << ",a=" << a << endl; cout << "b的地址是:" << &b << ",b=" << b << endl; return 0; } |
注意:数组没有引用。
各种形参的使用场景
传值、传地址和传引用的指导原则《C++ Primer Plus》
如果不需要在函数中修改实参
- 如果实参很小,如C++内置的数据类型或小型结构体,则按值传递。
- 如果实参是数组,则使用const指针,因为这是唯一的选择(没有为数组建立引用的说法)。
- 如果实参是较大的结构,则使用const指针或const引用。
- 如果实参是类,则使用const引用,传递类的标准方式是按引用传递(类设计的语义经常要求使用引用)。
如果需要在函数中修改实参
- 如果实参是内置数据类型,则使用指针。只要看到func(&x)的调用,表示函数将修改x。
- 如果实参是数组,则只能使用指针。
- 如果实参是结构体,则使用指针或引用。
- 如果实参是类,则使用引用。
当然,这只是一些指导原则,很可能有充分的理由做出其他的选择。
例如:对于基本类型,cin使用引用,因此可以使用cin>>a
,而不是cin>>&
。
留言