C++函数参数传递详解
目录
第一种传递方式:按值传递
第二种传递方式:指针传递
第三种传递方式:引用传递
const参数
main()函数的参数
大家都知道,在函数中参数分为实参和形参(参看本篇文章)https://mp.csdn.net/mp_blog/creation/editor/124362297现在我们来详细的看看这两者的区别和使用,简单的来说,形参就是一个可以操作的容器,实参就是里面的类容,而参数传递就是传递实参。
第一种传递方式:按值传递
对于基本类型的参数来说,按值传递就是简单的将实参的值赋给形参。
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int intnum, float floatnum, string str)
{cout << "打印整数" << intnum << endl;cout << "打印浮点数" << floatnum << endl;cout << "打印字符串" << str << endl;
}int main()
{int a = 5201314;float b = 1.0f;string str = "asjkdhaskjdl";bl(a, b, str);return 0;
}
运行结果
在实例中分别取3种类型的参数传递,对于整型和浮点型来说就是简单的赋值,但是string是一种自定义对象,把它拷贝到形参时需要调用string重载的赋值运算符进行拷贝。
第二种传递方式:指针传递
指针传递实质上就是一种按值传递,只是将一般类型换为了指针,由于自定义的对象大小可能会很大,赋值拷贝就比较浪费时间,在这种情况下,指针的效率就非常的高。因为它只需要传递地址的大小的数据。
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int a, int b)
{int temp = a;a = b;b = temp;cout << "a交换后的值为" << a << "交换后的b" << b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(a, b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}
运行结果
我们可以看到,在运行了bl函数后,形参a和b是交换成功的,但是为什么之后又没有交换成功了呐。这是因为形参本质上是作用域仅限于函数内部的局部变量,实参只是把值赋值给了形参,出来函数后作用域消失了,而实参还是原来的样式,用个例子来讲就是,一个人将一份文件复制了一份再放入原文件夹中,当修改复制文件的时候,原文件是不会改变的。下面我们来用指针来实现数字的交换。
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;cout << "a交换后的值为" << *a << "交换后的b" << *b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(&a, &b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}
运行结果
在本次程序中,a和b就保留了交换,这是因为我们传递的是地址,在打印的时候编译器就是取地址中的值。还是举个例子这次员工放入文件夹的是一个小字条,上面记载这文件电子档的网盘链接,当文件发送给编译者时,工作人员就可以通过链接修改原文件了。
第三种传递方式:引用传递
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;void bl(int &a, int &b)
{int temp = a;a = b;b = temp;cout << "a交换后的值为" << a << "交换后的b" << b << endl;
}int main()
{int a = 520;int b = 1314;cout << "交换前的a" << a << "交换前的b" << b << endl;bl(a, b);cout << "交换后a" << a << "交换后b" << b << endl;return 0;
}
在引用传递中就是把*改为&。比较简单。就不做过多的描述了。
const参数
我们在设计函数时首先要考虑的就是函数用来干什么后,我们就可以考虑函数的具体实现了,为了防止在实现函数的时候不能修改参数,我们可以使用const关键词修饰参数。
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;char bl(const string& str)
{//把下面一行设为注释就可以运行str[str.length() - 1] = 's';return str[str.length() - 1];
}int main()
{string str = "hello";cout << "字符串最后一个字符为:" << bl(str) << endl;return 0;}
在本例中由于函数修改了字符串中的字符,违反了const语句,编译器就会报错。
main()函数的参数
main()函数作为主函数,在前面参数列表都是空的,其实它是可以又参数的,有参数的main()函数是这样的int main(int argc,char*argv[]),或者是int main(int argc,**argv)
//函数参数传递
//作者:分解机226#include <iostream>
using namespace std;int main(int argc, char** argv)
{int sum = 0;for (int i = 0; i < argc; i++){sum += atoi(argv[i]);}cout << "输入所有数总和为:" << sum << endl;return 0;
}
本程序需要在命令行窗口后面加上参数,才可以运行
谢谢
C++函数参数传递详解相关推荐
- uboot linux内核传递参数,Uboot与Linux之间的参数传递详解
原标题:Uboot与Linux之间的参数传递详解 U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等.而Linux kernel也会读取和处理这些参数.两者之间通 ...
- c语言 is函数,关于C语言回调函数的详解~
原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...
- python lambda函数-Python的Lambda函数用法详解
在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要 ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- R语言tidyr包separate()函数实战详解:一列裂变为多列
R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
最新文章
- java练气期(3)----java高级(网络编程)
- 一个torch版本报错
- Android笔记 style样式
- Vue项目报错:This relative module was not found
- springboot 全局异常处理类
- Springboot 5.Springboot 返回cookies信息的post接口开发
- 20201125 plecs更新
- Java项目集成工作流引擎解决方案及实例展示(前后分离版)
- 三星s9刷android9,三星S9港版安卓9rom系统线刷包:TGY-G9600ZHU5CSG8-刷机之家
- Unity -- 正交/透视相机切换(2D/3D相机切换)
- 浅析汽车芯片信息安全之安全启动
- 微信公众号项目录音上传功能
- 根据音乐播放进度实时更新音乐播放器播放进度条
- kf 和 ekf 和 ukf 入门
- 作业帮猿辅导们的隐忧:下沉市场真的是在线教育的菜?
- loadrunner入门教程(31) --Analysis
- erdas监督分类(一)
- 记录一次使用DDNS动态域名解析服务外网通过域名访问内网服务器服务的过程
- c语言如何自动生成word,C语言读取word文档的方法
- 什么是云服务器主机?