C++——参数传递

前言

  形式参数(形参):出现在函数定义的地方,形参之间以“,”分隔,其规定了函数接受数据的类型和数量(参数的数目)

  实际参数(实参):出现在函数调用的地方,用于初始化形参(实参的数目、类型与形参相同)。

一、值传递

  值传递,顾名思义,仅仅传递实参的值,因而形参无法改变实参。

复制代码
 1 #include <iostream>
 2 
 3 void swap(int a, int b) {
 4     int temp;
 5     temp=a;
 6     a=b;
 7     b=temp;
 8     std::cout << "a is " << a << ";" << "b is " << b << std::endl;
 9 
10 }
11 
12 int main(int argc, char * argv[]) {
13     int m=1,n=2;
14     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
15     swap(m,n);
16     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
17 }
复制代码

  执行上述代码可见如下结果:

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 1;n is 2

  可见当参数以值传递时,形参的改变并不会改变实参

二、指针传递

  指针传递,也就是将实参的地址传递给形参,因而可以修改实参的值,但是这种方法容易出错,导致参数被程序非法访问。

复制代码
 1 #include <iostream>
 2 
 3 void swap(int *a, int *b) {
 4     int temp_int=0;
 5     int *temp_ptr=&temp_int;
 6     temp_ptr=a;
 7     a=b;
 8     b=temp_ptr;
 9     std::cout << "a is " << *a << ";" << "b is " << *b << std::endl;
10 
11 }
12 
13 int main(int argc, char * argv[]) {
14     int m=1,n=2;
15     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
16     swap(&m,&n);
17     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
18 }
复制代码

  指针传递实际上传递的是实参的地址,进而可以通过指针修改形参的值,但实参本身并没有发生变化。其结果如下所示:

  

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 1;n is 2

三、引用传递

  引用传递,此时形参就是实参的别名,因而可以修改实参的值。

复制代码
 1 #include <iostream>
 2 
 3 void swap(int &a, int &b) {
 4     int temp;
 5     temp=a;
 6     a=b;
 7     b=temp;
 8     std::cout << "a is " << a << ";" << "b is " << b << std::endl;
 9 }
10 
11 int main(int argc, char * argv[]) {
12     int m=1,n=2;
13     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
14     swap(m,n);
15     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
16 }
复制代码

  引用传递不同于前两者,此时的形参是实参的别名,因此对于形参的操作也就是对于实参的操作。

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 2;n is 1

四、注意

  1、传值或是传址本质上是一种拷贝操作,前者拷贝变量本身,后者拷贝变量的地址。对于某些class中类型对象或容器对象,拷贝操作比较低效,甚至有些类的类型不支持拷贝操作(IO类型)。因此在C++中我们应尽量采用引用避免拷贝

  2、利用引用传递我们也可以返回额外的信息(一个函数只能返回一个值,而引用调用可以改变实参帮助我们返回额外的信息)

五、参考

  1、C++ Primer(中文版/第五版)——6.2.2(P188)

本文作者:有梦-

本文链接:https://www.cnblogs.com/hjxiamen/p/16743590.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   有梦-  阅读(37)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑