何时通过引用或指针传递参数?

2024 年 8 月 28 日 | 3 分钟阅读

在 C++ 中,由于以下原因,变量通过引用传递:

1) 更改调用者函数的局部变量: 引用(或指针)允许被调用函数修改调用者函数的局部变量。考虑以下示例程序,其中 fun() 可以更改 main() 的局部变量 x。

C++ 代码

输出

New value of x is 20

2) 传递大参数时: 传递大参数时,通过引用(或指针)传递更有效,因为只传递地址,而不是整个对象。考虑以下 Employee 类和函数 printEmpDetails(),它打印 Employee 详细信息。

C 代码

上述代码的问题在于: 每次调用 printEmpDetails() 时,都会构造一个新的 Employee 对象,这涉及到创建所有数据成员的副本。因此,更好的实现方式是将 Employee 作为引用传递。

这仅适用于结构体和类变量,因为像 int、char 等基本类型没有效率优势。

3) 避免对象切片: 如果我们将一个子类对象传递给一个期望超类对象的函数,如果按值传递,则传递的对象会被切片。考虑以下程序,它打印“This is Pet Class”。

C 代码

输出

This is Pet Class

当我们在上述程序中使用引用传递时,它会正确打印“ This is Dog Class ”。请参见下面的修改后的程序。

C++ 代码

输出

This is Dog Class

这对于 int、char 等基本数据类型也不适用。

4) 在函数中实现运行时多态性: 通过将对象作为引用(或指针)传递给函数,我们可以使其具有多态性。例如,在以下程序中,print() 接收基类对象的引用。如果传递基类对象,则函数 print() 调用基类函数 show(),如果传递派生类对象,则调用派生类函数 show()。

C++ 代码

输出

In base 
In derived 

*指针具有值,并且由于 C++ 中的函数参数默认按值传递,因此当你使用指针时,指针的副本会传递给函数。

结论

如果参数很大(例如列表中的字符串),最好使用引用传递,以避免移动整个字符串。引用传递实际上只传递参数的地址,而不是参数本身。