C++引用做函数参数

C++引用做函数参数教程

C++ 中,引用 的一个重要作用就是作为 函数 的参数。在 C 语言函数参数 传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是 指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。

但是在 C++ 中又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

C++函数参数使用引用

  • 传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
  • 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
  • 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用 “*指针变量名” 的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
  • 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用 常引用

案例

C++引用做函数参数

定义 C++ 引用做函数参数

#include <iostream> using namespace std; int swap(int a, int b) { int temp = a; a = b; b = temp; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; int a = 1024, b = 1100; cout << "before a = " << a << " b = " << b << endl; swap(a, b); cout << "after a = " << a << " b = " << b << endl; return 0; }

程序运行后,控制台输出如下图所示:

48_C引用做函数参数.png

我们首先,定义了一个 swap 函数,想通过该函数实现交换两个参数的值,最后,我们在 main 函数里面调用了该函数,但并未能实现交换两个变量的值,现在,我们修改程序,使用指针传递参数,修改如下:

#include <iostream> using namespace std; int swap(int *a, int *b) { int temp = *a; *a = *b; *b = *temp; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; int a = 1024, b = 1100; cout << "before a = " << a << " b = " << b << endl; swap(&a, &b); cout << "after a = " << a << " b = " << b << endl; return 0; }

程序运行后,控制台输出如下图所示:

49_C引用做函数参数.png

这次,我们使用了指针传递,我们看到,实现了交换了两个变量的值,现在,我们再次修改程序,修改为使用引用传递参数,修改如下:

#include <iostream> using namespace std; int swap(int& a, int& b) { int temp = a; a = b; b = temp; } int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; int a = 1024, b = 1100; cout << "before a = " << a << " b = " << b << endl; swap(a, b); cout << "after a = " << a << " b = " << b << endl; return 0; }

程序运行后,控制台输出如下图所示:

50_C引用做函数参数.png

这次,我们使用了引用传递,我们看到,同样实现了交换了两个变量的值。

C++引用做函数参数总结

传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。