引用的形参和const

左值是可以被引用的数据对象,可以通过地址访问它们,例如:变量、数组元素、结构体成员、引用和解引用的指针。
非左值包括:

  1. 字面常量(用双引号包含的字符串除外)。
  2. 包含多项的表达式。

引用用于函数的返回值

传统的函数返回机制与值传递类似。

函数的返回值被拷贝到一个临时位置(寄存器或栈),然后调用者程序再使用这个值。

double m=sqrt(36); // sqrt()是求平方根函数。
sqrt(36)的返回值6被拷贝到临时的位置,然后赋值给m。

cout << sqrt(25);
sqrt(25)的返回值5被拷贝到临时的位置,然后传递给cout。

如果返回的是一个结构体,将把整个结构体拷贝到临时的位置。

如果返回引用不会拷贝内存。
语法:
返回值的数据类型& 函数名(形参列表);

注意:

  • 如果返回局部变量的引用,其本质是野指针,后果不可预知。
  • 可以返回函数的引用形参、类的成员、全局变量、静态变量。
  • 返回引用的函数是被引用的变量的别名,将const用于引用的返回类型,示例如下。

示例:

注意:数组没有引用。

各种形参的使用场景

传值、传地址和传引用的指导原则《C++ Primer Plus》

如果不需要在函数中修改实参

  • 如果实参很小,如C++内置的数据类型或小型结构体,则按值传递。
  • 如果实参是数组,则使用const指针,因为这是唯一的选择(没有为数组建立引用的说法)。
  • 如果实参是较大的结构,则使用const指针或const引用。
  • 如果实参是类,则使用const引用,传递类的标准方式是按引用传递(类设计的语义经常要求使用引用)。

如果需要在函数中修改实参

  • 如果实参是内置数据类型,则使用指针。只要看到func(&x)的调用,表示函数将修改x。
  • 如果实参是数组,则只能使用指针。
  • 如果实参是结构体,则使用指针或引用。
  • 如果实参是类,则使用引用。

当然,这只是一些指导原则,很可能有充分的理由做出其他的选择。
例如:对于基本类型,cin使用引用,因此可以使用cin>>a,而不是cin>>&

最后修改日期: 2023年7月27日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。

15 + 5 =