C++学习笔记(二)——交换函数(swap)

这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C++中如何选择传参方式。

先来看第一段程序:

void swap(int x, int y) {int temp = y;y = x;x = temp;
}

通过main函数的调用,我们发现x,y并未实现交换:

int main()
{int x = 1;int y = 37;swap(x, y);cout << x << ":" << y << endl;return 0;
}

原因是整形x和y在函数swap内为按值传递,按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝,这些拷贝被存储在运行栈中,因此改变这些值不会影响实参的值。一旦函数结束了,函数的活动记录将从栈中弹出,这些局部值也就消失了。

在按值传递的情况下,实参的内容没有被改变。这意味着程序员在函数调用时无需保存和恢复实参的值。如果没有按值传递机制,那么每个没有被声明为const 的参数就可能会随每次函数调用而被改变。按值传递的危害最小,需要用户做的工作也最少。毫无疑问,按值传递是参数传递合理的缺省机制。

另外,如果作为实参的变量是一个大型类的对象,分配并拷贝到栈中的时间和空间开销往往过大。

要实现swap函数的效果,我们应如何处理呢?第一个可行的做法是将形参声明成指针:

void pswap(int *x, int *y) {int temp = *y;*y = *x;*x = temp;
}

 

在pswap函数中,由于传递的是两个变量的内存地址(指针)使得我们可以直接操作对应的值。实际上这里还是存在按值传递的问题,只是由原先的整形传递变成了指针传递。我们可以修改指针指向的内存却依然无法修改指针本身。第二个可行的做法是想形参声明为指针的引用:

void prswap(int *&x, int *&y) {int temp = *y;*y = *x;*x = temp;
}void prswap(int *&x, int *&y) {int *temp = y;y = x;x = temp;
}

 

请注意,同一个函数原型下我提供了两种函数定义。可无论哪一种,在实参传递的阶段都不会发生按值传递的问题。那么两种定义到底哪一种更满足我们需求:

(1)交换内存中的值

(2)交换指针地址

如果单独考虑本文的需求,第一种方法更满足。但是,如果我们需要交换的是一个大型类对象,第二种的效率则更高。

总结:内存管理是C++学习的一个难点,初学者往往不容易掌握。但越是如此就越能体现一个开发者的语言内功。

转载于:https://www.cnblogs.com/learnhow/p/8543822.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据背后是个万亿市场

2014年的GDP中消费占比已经超过了50%&#xff0c;标志着中国经济正在向市场经济转型&#xff0c;消费占GDP50%&#xff0d;70%是中等发达国家向市场经济过渡的一个表现&#xff0c;未来中国经济增长最大的引擎应该来源于消费&#xff0c;特别是个人消费。中国正在经历经济结构调…

ipad iphone开发_如何将iPhone或iPad置于恢复模式

ipad iphone开发If your iDevice starts acting strangely and you’ve run through the gamut of normal troubleshooting fixes, Recovery Mode may be your answer. This lets you easily reset the device and re-install iOS using iTunes. 如果您的iDevice开始运行异常&a…

从三层架构说起,谈谈对历史项目的小改造

web development项目背景说明最近接手一个 “老” 项目的需求修改&#xff0c;项目整体基于 .net core 3.1 平台&#xff0c;以传统的三层架构为基础构建。了解需求后&#xff0c;逐步对原有项目框架进行大概的了解&#xff0c;主要是熟悉一些框架的开发规范&#xff0c;基本工…

C# message简单实现窗口间信息接收与发送

刚接触windows 不同程序 窗口消息传递&#xff0c;不理解IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam)这函数怎么用&#xff1f;消息内容怎么传递过去&#xff0c;还遇到需要message结构体&#xff1f;IntPtr怎么用呢&#xff1f; 但实际只是用来传个…

在Kubernetes集群上部署和管理JFrog Artifactory

JFrog Artifactory是一个artifacts仓库管理平台&#xff0c;它支持所有的主流打包格式、构建工具和持续集成&#xff08;CI&#xff09;服务器。它将所有二进制内容保存在一个单一位置并提供一个接口&#xff0c;这使得用户在整个应用程序开发和交付过程中&#xff0c;能更易于…

已知思科ASA设备漏洞仍在其新版本中存在

近日&#xff0c;名为“Shadow Brokers(影子经纪人)”的黑客组织声称成功入侵了跟NSA相关的Equation Group(方程式组织)的计算机系统&#xff0c;并成功窃取到了大量的机密信息以及黑客工具。随后&#xff0c;“Shadow Brokers”黑客组织将60%的泄漏文件在网上进行了公布&#…

Yii Listview

转载于:https://www.cnblogs.com/xiong63/p/8546376.html

.NET 7 的 AOT 到底能不能杠反编译?

一&#xff1a;背景 1.讲故事在B站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&#xff0c;可能有很多朋友对逆向不了解&#xff0c;以为用 ILSpy,Reflector,DnSpy 这…

google hdr+_更好的隐私权控制使Google+死了

google hdrEarlier this year, Google started a project to review third-party developer access to Google accounts through the use of APIs. It found a security breach surrounding Google, and is now shutting the service down, at least for consumers. 今年年初&a…

新0-Day漏洞或将给Linux桌面发行版带来浩劫

Linux 的各个发行版都一直强调安全及其相关元素&#xff0c;比如防火墙、渗透测试、沙盒、无痕上网和隐私等等&#xff0c;但事实上可能并没有想象中的那么安全。安全研究员 Chris Evans 公开了其发现的针对 Linux 桌面发行版的 0day 漏洞&#xff0c;利用特制的音频文件入侵 L…

一份详尽的利用 Kubeadm部署 Kubernetes 1.13.1 集群指北

2019独角兽企业重金招聘Python工程师标准>>> 概 述 Kubernetes集群的搭建方法其实有多种&#xff0c;比如我在之前的文章《利用K8S技术栈打造个人私有云&#xff08;连载之&#xff1a;K8S集群搭建&#xff09;》中使用的就是二进制的安装方法。虽然这种方法有利于我…

.NET性能优化-使用内存+磁盘混合缓存

我们回顾一下上一篇文章中的内容&#xff0c;有一个朋友问我这样一个问题&#xff1a;我的业务依赖一些数据&#xff0c;因为数据库访问慢&#xff0c;我把它放在 Redis 里面&#xff0c;不过还是太慢了&#xff0c;有什么其它的方案吗&#xff1f;其实这个问题比较简单的是吧&…

最小生成树详解

注&#xff1a;本文算法使用链式前向星数据结构实现。学习链接&#xff1a;链式前向星-学习笔记 一、Prim算法 普通prim算法模板&#xff1a; //用前向星录数据的时候记得把head初始化为-1 fill(dist,distLEN,MAX); memset(vis,0,sizeof vis); int ans0; dist[1]0; //如…

dropbox文件_Dropbox即将发布的扩展程序更新将添加更多文件编辑支持,包括Pixlr照片...

dropbox文件Dropbox is perhaps the best-known cloud storage platform for consumers, but it’s hoping to become something more. With an upcoming overhaul to its user tools, Dropbox will add more complex editing tools, in addition to what it already provides …

黑客窃取思科、IBM与甲骨文认证管理系统内的敏感数据

目前一套被思科、F5、IBM以及甲骨文等企业所广泛使用的认证管理系统(即Credential Manager System)正面临着数据泄露风险&#xff0c;其中的敏感数据也许已经被黑客们所获取。 根据Pearson VUE(主营计算机测试方案开发与交付)发布的一项公告&#xff0c;某恶意软件已经藏身于该…

Spring下载地址

下载地址&#xff1a;https://repo.spring.io/libs-release-local/org/springframework/spring/ 进入后可选择下载版本&#xff0c;选择版本后&#xff0c;进入目录结构。其中dist是最终发布版本&#xff0c;包含开发所需lib和源码。docs是开发文档。schema是一些约束文件。 Do…

.NET7发布,一大批优秀.NET6项目没人看了吗...(都是好项目)

恍惚间都已经.NET7.0了&#xff0c;不能再呆在旧版本了&#xff01;这里分享一套Vue3 Axios TS Vite Element Plus .NET 6 WebAPI JWT SqlSugar的通用管理后台&#xff0c;各种最新框架组件&#xff0c;学习必备&#xff01;这里把源码、脚本以及专门录制的视频教程都打…

Python的日志记录-logging模块的使用

一、日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法&#xff0c;软件开发者在代码中调用日志函数&#xff0c;表明发生了特定的事件&#xff0c;事件由描述性消息描述&#xff0c;同时还包含事件的重要性&#xff0c;重要性也称为级别或严重性。 1.2何时使用日…

询问HTG:白噪声屏幕保护程序,有效的文件命名以及从密码泄露中恢复

Once a week we share three of the questions we’ve answered from the Ask HTG inbox with the greater readership; this week we’re looking at white noise screen savers, efficient file naming systems, and recovering from a password compromise. 每周一次&#…

专家预测第二波WannaCry勒索病毒攻击即将到来!

WannaCry的传播脚步今晨戛然而止 今天一大早&#xff0c;全网的WannaCry蠕虫病毒攻击突然减弱消退了!所有这一切功劳来自于英国研究人员malwaretech&#xff0c;他通过逆向发现WannaCry代码中有一个特殊域名地址&#xff1a; www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.co…