- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++中函数的用法小结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
函数在C++中的使用,无非2种地方,一处是函数的定义,一处是函数的调用。而函数的定义则非常简单,由三个部分组成:函数的返回类型、函数名和函数的形参表。当然,这里不同的函数定义可以还会稍有不同,比如类的成员函数、内联函数等。这里我们主要讨论函数的调用时需要注意的一些问题.
1、参数传递 。
我们将函数定义或声明里的参数叫形参,而在调用函数时传入的参数叫实参。那么根据形参类型的不同,有几下形式的参数传递.
1,非引用形参 。
1)普通的内置类型 。
普通非引用类型的参数通过复制对应的实参实现形参的初始化。当用实参的副本初始化形参时,函数并没有访问调用所传递的实参的本身,因此函数不可能改实参的值。比如下面的交换两个数的程序:
。
void swap(int v1, int v2) { int temp = v1; v2 = v1; v1 = temp; } 。
。
swap(a, b);// 调用swap 。
。
上面程序中,实参为a与b,但是在调用时,v1与v2接受的是a与b的副本,所以实际上a与b的值没有变化.
2)指针形参 。
函数的形参可以是指针,此时将复制实参指针,其实这类跟1)原理类似,函数内并无法改变实参的指针值。只是函数可以通过复制到的地址改变实参指针所指向的值.
。
。
上面程序中定义的swap的形参为指针类型,main中调用swap,实际上swap并不能改变p1与p2的值,只是改变了它们所指向的值.
3)const 形参 。
对于普通的非引用类型用const修饰实际上是没有意义的,因为本来函数就不会改变实参的值。像下面的定义,实际中编译器会忽略const的定义,而将其视为int型.
。
。
2,引用形参 。
1)在上面的程序中我们看到,如果想交换两个变量的值,通过调用普通的非引用类型形参的函数,并不能实现。用它们的指针可以,同时我们也可以用引用.
。
。
在实际调用swap时,v1与v2实际相当于a与b的另一个名字.
2)在有的时候我们需要向函数传递大型对象,需要使用引用形参,如果直接使用复制实参的形式可以,但是它的效率太低了,甚至有些对象是无法复制的。但是使用引用形参时,我们不希望函数改变了实参传入的值,我们就可以使用const来限定形参。下面程序用来判断哪个字符串更长,明显我们不希望函数会改变字符串的内容,我们就可以用const引用型的形参.
。
。
所以,如果使用引用形参的惟一的目的是避免复制实参时,则应将形参定义为const引用.
3)在使用引用形参函数时,有两点值得注意:
不要用const限定的实参或字面值来调用非const引用形参函数。因为这样函数内,可以改变实参的值,这不合法.
非const引用形参只能与完全同类型的非const对象关联.
4)传递指向指针的引用 。
如下有下面的程序:
。
。
上面的程序依然不能改变a与b的值,但是它改变了p1与p2的值,现在p1指向了b,而p2指向了a.
3,其他类型的形参 。
1)vector和其他类型的形参:一般在这种类型作为形参时,为了避免复制应该考虑形参声明为引用类型。C++程序员倾向于传递容器中需要处理的元素的迭代器来传递容器.
2)数组形参:由于数组不能复制,所以不能直接编写数组类型的形参函数,一般通过传递指向数组的元素的指针来处理数组。值得注意的是在通过引用传递数组时,在调用函数时形参与实参的类型要匹配.
。
。
2、函数的返回值 。
1)没有返回值 。
很多函数并没有返回值,尤其是现在C++风格,习惯于把需要的结果作为引用形参。这类型函数一般没有return语句,有时候有return是使函数中途中断执行.
2)返回非引用类型 。
这种情况在函数调用处,程序会用一个临时变量复制函数的返回值.
3)返回引用 。
当函数返回引用类型时,并没有复制返回值。相反,返回的是对象本身.
在返回引用这种情况下,注意不要返回局部变量的引用,因为局部变量在函数体内定义,当函数执行完后就销毁了,所谓的引用也就没有意义了。同理,不要返回指向局部变量的指针.
3、重载函数 。
出现在相同作用域中的两个函数,如果具有相同的名字而形参不同,则称为重载函数.
1)注意区分函数重载与重复声明 。
有些看起来不同的形参,本质是相同的。下面代码中的都是重复声明的例子 。
。
typedef double newDouble; int func(double i); int func(newDouble i); // 没有新类型 。
。
int func1(int, int = 1); //只是提供默认参数 int func1(int ,int),
int func2(int); int func2(const int); //对于普通非引用形参用cosnt修饰是没有意义的 。
。
2)重载与作用域 。
局部声明的函数,将屏蔽所有全局作用的同名函数。下面例子显示,即使全局作用的函数更加匹配调用的实参类型,但是仍然调用的是局部的函数.
。
。
上面程序中,将调用void print(double)函数,虽然42是int型.
3)重载确定的三个步骤 。
如果定义了众多的函数重载,将存在函数调用到底与哪个重载函数相匹配的问题。我们通过下面的示例代码来说明问题:
。
。
第一步:确定候选函数 。
假如我们调用f(4.2),那么先找到同名函数,并且在作用域内可见,上面例子中5个函数都满足.
第二步:选择可行的函数 。
必须满足2个条件:一是函数形参与该调用实参个数相同;第二,每个实参的类型必须与对应的类型匹配,或者可以被隐式转换为对应的形参类型。这里我们再调用f(4.2)时,排除了1、4、5号函数,只剩下2与3。其中2号函数可以通过类型转换来满足.
第三步:寻找最佳匹配 。
在经过第二步确定后,剩下2与3函数,那么2需要进行类型转换,显然3是最佳匹配了.
但是如果这样调用f(42,4.2)。这时候就会出现二义性,编译器将提示.
还有一种要注意的就是有默认参数的函数,比如我们定义6号函数为void f(double,int =1);那么在调用f(4.2)时就会有二义性.
可基于函数的引用形参是指向const对象还是指向非const对象实现函数重载.
最后此篇关于C++中函数的用法小结的文章就讲到这里了,如果你想了解更多关于C++中函数的用法小结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 前言 style-loader css-loader sass-loader postcss-loader babel-l
目录 1、简单动态字符串(SDS) 2、链表 3、字典 哈希表 哈希表节点 字典 4、跳跃表
JS运行三部曲 js运行代码共分三步 语法分析 预编译 解释执行 JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内
目录 +拼接方式 sprintf函数 Join函数 buffer.Builderbuffer.WriteString函数 buffer.B
下面整理下python有哪些方式可以读取数据文件。 1. python内置方法(read、readline、readlines) read() : 一次性读取整个文件内容。推荐使用re
背景 项目中的流程监控,有几种节点,需要监控每一个节点是否超时。按传统的做法,肯定是通过定时任务,去扫描然后判断,但是定时任务有缺点:1,数据量大会慢;2,时间不好控制,太短,怕一
目录 1. 提炼函数 2. 合并重复的条件片段 3. 把条件分支语句提炼成函数 4. 合理使用循环 5. 提前让函数退出代替嵌套条件分支
开始之前,pandas中dataframe删除对象可能存在几种情况 1、删除具体列 2、删除具体行 3、删除包含某些数值的行或者列 4、删除包含某些字符、文字的行或者列 本文就针对这四种情况探讨
setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理。 工作原理 小程序的视图层
下面是五种实现斐波那契数列的方法 循环 ? 1
一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第
python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。本文主要介绍了一些简单易懂最常用的python图像处理库。 当今世界充满了各种
流式布局 采用流式布局会将元素按从左到右的顺序排列,如果一个元素在一行中放不下,那这个元素会另起一行依然按照从左到右的顺序排列 示例: 代码 public class Tes
@PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.properti
实现消息队列的两种方式 apache activemq官方实例发送消息 直接在apache官网http://activemq.apache.org/download-archives.html下
常用配置 以下配置能使用File -> New Projects Settings -> Settings for New Projects进行配置的尽量用这个配置,因为这个配置是作用
摘要: 开发者开发部署web应用时通常使用tomcat服务器,很多初学者只懂得在开发工具上配置,但离开了开发工具,自己手动配置部署,并让一个项目跑起来,你会了吗。小编也遇到过这样的困扰。网上查找的
1. 字符串的翻转 利用切片 ? 1
cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结。 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取
1、使用内置的tomcat,通过java -jar的方式启动 比如:java -jar bms.jar 但是这种启动方式 一旦关闭控制台 或者crtl+c 退出 此时应用就关闭了
我是一名优秀的程序员,十分优秀!