在C++中,参数传递的方式是“实虚结合”。

  • 按值传递(pass by value)
  • 地址传递(pass by pointer)
  • 引用传递(pass by reference)

按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。

使用这种方式,调用函数本身不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。

 /*
pass By value
*/
#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
int a = , b = ;
cout << "a = " << a << ", b = "
<< b << endl;
swap(a,b);
cout << "a = " << a << ", b = "
<< b << endl;
return ;
}
void swap(int x, int y)
{
int t = x;
x = y;
y = t;
}

pass By value

如果在函数定义时将形参定义为指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。

地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

 /*
pass by reference
*/
#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
int a = , b = ;
cout << "a = " << a << ", b = "
<< b << endl;
swap(&a,&b);
cout << "a = " << a << ", b = "
<< b << endl;
system("pause");
return ;
}
void swap(int *x,int *y)
{
int t = *x;
*x = *y;
*y = t;
}

pass by pointer

按值传递方式容易理解,但形参值的改变不能对实参产生影响。

地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。

如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。

 /*
pass by reference
*/
#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
int a = , b = ;
cout << "a = " << a << ", b = "
<< b << endl;
swap(a,b);
cout << "a = " << a << ", b = "
<< b << endl;
system("pause");
return ;
}
void swap(int &x,int &y)
{
int t = x;
x = y;
y = t;
}

pass by reference

比较:

对比参数的三种传递方式,可以发现“引用传递”和“指针传递”的性质一样,而书写方式像“值传递”。引用传递可以做的任何事指针也能够做到,因为指针能够毫无约束地操作内存中的东西,这种强大的功能背后也必将隐藏着巨大的危险,所以慎用指针。

C++中函数调用时的三种参数传递方式的更多相关文章

  1. C++中函数调用时的三种参数传递方式详解

    在C++中,参数传递的方式是“实虚结合”. 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) 按值传递的过程为:首先计 ...

  2. 【整理】--C++三种参数传递方式

    在C++中,共有三种参数传递方式: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) (1)按值传递的过程为:首先计算 ...

  3. C语言三种参数传递方式

    值传递.指针传递.引用传递 只有在函数调用时,才会为形参分配内存空间,调用结束便会释放. 值传递和指针传递,传递的都是实参的一份拷贝. C语言在线编译器:http://www.dooccn.com/c ...

  4. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  5. DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...

  6. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  7. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  8. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  9. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

随机推荐

  1. 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground

    建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...

  2. Python之安装第三方扩展库

    PyPI 地址:https://pypi.python.org/pypi 如果你知道你要找的库的名字,那么只需要在右上角搜索栏查找即可. 1.pip安装扩展库 (1)安装最新版本的扩展库: cmd&g ...

  3. python的reflect反射方法

    核心内容专自:http://www.liujiangblog.com/course/python/48 在自动化测试的时候,需要从excel中读取关键字,此关键字对应一个方法,如何使用该关键字去调用真 ...

  4. Markdown应用样例

    Markdown编辑器: https://www.typora.io/ Markdown主题: http://theme.typora.io/ 1.标题 一号标题 三号标题 六号标题 2.超链接 Cm ...

  5. unity面试准备

    最近有换工作的打算 所以上网看下面试题 自己做下总结 Q:ArrayList 和 List区别 A: 1:List大家都知道初始化的时候需要定义其类型,例如 List<int> listT ...

  6. ptyhon【递归练习】

  7. windows Win7如何设置多用户同时远程登录

    windows  Win7如何设置多用户同时远程登录 1.创建一个用户 密码永不过期 2.在本地组策略编辑器里面,依次展开计算机配置--->管理模板--->Windows组件---> ...

  8. fillna()

    将下面注释掉 fillna() 函数:有一个inplace参数,默认为false,不会对原来dataframe中进行替换,为True时候会修改原来的.

  9. struts2官方 中文教程 系列二:Hello World项目

    先贴个本帖的地址,免得其它网站被爬去了struts2入门系列二之Hello World  即 http://www.cnblogs.com/linghaoxinpian/p/6898779.html ...

  10. myeclipse部署项目到tomcat-custom_location 方式

    在想要部署的路径下:1.新建一个在tomcat--->server.xml文件夹下设置的文件名 2.在新建的文件夹下新建一个  ROOT文件夹, 3.在myeclipse里面吧项目部署到 ROO ...