html绑定带有形参的函数,C++中函数

参数

参数分为形参和实参,形参是在函数定义的形参表中进行定义,是一个变量,其作用域为整个函数。而实参出现在函数调用中,是一个表达式,用传递给函数的实参对形参进行初始化。

函数形参表可以为空,但不能省略。没有任何形参的函数可以用空形参表或含有单个关键字void的形参表来表示。

C++是一种静态强类型语言,对于每一次函数调用,编译时都会检查其实参。

每次函数调用时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。

形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值;如果形参为引用类型,则它只是实参的别名。

普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参的副本初始化形参时,函数并没有访问调用所传递 的实参的本身,因此不会修改实参的值。

函数的形参可以为指针,此时将复制实参指针。与其他费引用类型的形参一样,该类形参的任何改变也仅仅作用于局部副本。

指针形参是指向const类型还是飞const类型,将影响函数调用所使用的参数。可以将指向const对象的指针初始化为指向非const对象,但是不可以让指向非const对象的指针指向const对象。

与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。另外,如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。

关于传递指向指针引用,这个对于我来说,比较难理解啊,总想不明白为啥这样定义。下面举个例子:

假如想编写一个交换两个整数的swap函数,实现两个指针的交换。已知需用*定义指针,用&定义引用。现在,问题是如何将这两个操作符结合起来以获得指向指针的引用。

void swap(int *&v1, int *&v2)

{

int *tmp = v2;

v2 = v1;

v1 = tmp;

}

形参int *&v1

顶定义从右往左理解:v1是一个引用,与指向int型对象的指针相关联。也就是说,v1只是传递进swap函数的任意指针的别名。

返回值

这里要记录的是自己需要注意的地方。

(1)返回非引用类型

用函数返回值初始化临时对象与用实参初始化形参是一样的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值即可以是局部对象,也可以是求解表达式的结果。

(2)返回引用

当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。考虑下面的函数,此函数返回两个string类型形参中较短的那个字符串的引用:

const string &shortstring(const string &s1, const string &s2)

{

return s1.size() < s2.size() ? s1 : s2;

}

形参和返回类型都是指向const string类型的引用,调用函数和返回结果时,都没有复制这些string对象。

记住:千万不要返回局部变量的引用。(3)引用返回左值

返回引用的函数返回一个左值。因此,这样的函数可用于任何要求使用左值的地方:

char &get_val(string &str, string::size_type ix)

{

return str[ix];

}

int main()

{

string s("a value");

cout << s << endl;

get_val(s, 0) = 'A'; //change s[0] to A

cout << s << endl;

return 0;

}

给函数返回值赋值可能让人惊讶,由于函数返回的是一个引用,因此是正确的。

如果不希望引用返回值被修改,返回值应该声明为:const char &get_val(.....)。

(5)千万不要返回指向局部变量的指针

一旦函数结束,局部对象被释放,返回的指针就变成了指向不在存在的对象的悬垂指针。

默认实参

当一个函数具有多个参数时,定义默认参数的方向是从右向左的,即以最后一个参数定位的;而匹配参数的方向是从左向右的,即以第一个参数定位的,如下图所示。

68eedab35c2142e7b3add2ce9004eb85.png

上图来自网友,具体出处忘记了,感谢。

如果我们要定义默认参数,那么我们必须从最后一个参数定义起,并且逐渐向前(左)定义,不可以跳过某个参数,直到所有的形参都被定义了默认值。

如果我们调用了一个定义了默认参数的函数,那么我们填写的第一个参数一定是和最左边的形参匹配,并且逐渐向后(右)匹配,不可以中途省略某一个参数,直到所有未被设置默认值的形参都已经有参数。

于是,调用函数时,用户向右自定义的实参至少要和向左来的已经定义的默认参数的形参相邻,函数才能被成功调用。否则这个函数就是缺少参数的。

指定默认实参的约束:

既可以在函数声明也可以在函数定义中指定默认实参。但是,在一个文件中,只能为一个形参指定默认实参一次。下面的例子是错误的:

//ff.h

int ff(int = 0);

//ff.cc

#include "ff.h"

int ff(int = 0){....} //error

通常,应该在函数声明中指定默认实参,并将该声明放在合适的头文件中。

指向函数的指针

函数指针是指指向函数而非指向对象的指针。

bool (*pf)(const string &, const string &);

这个语句将pf声明为指向函数的指针,它所指向的函数待遇两个const string&类型的形参和bool类型的返回值。

(1)用typedef简化函数指针的定义

使用typedef为指针定义同义词,可以使函数指针的使用大大的简化:

typedef bool (*cmpfcn)(const string &, const string &);

该定义表示了cmpfcn是一种指向函数的指针类型的名字。在要使用这种函数指针的类型时,只需要直接使用cmpfcn就可以了。

(2)指向函数的指针的初始化和赋值

**在引用函数名单又没有调用该函数时,函数名将被自动解释为指向函数的指针。假如有函数:

bool lengthcompare(const string &, const string &);

除了用作函数调用的左操作数外,对lengthcompare的任何使用都被解释为如下类型的指针:

bool (*)(const string &, const string &);

可以使用函数名对函数指针进行初始化或赋值:

cmpfcn pf1 = 0; //ok:unbound pointer to function

cmpfcn pf2 = lengthcompare;  //ok:pointer type matches function's type

pf1 = lengthcompare;         //ok:pointer type matches function's type

pf2 = pf1;                   //ok:pointer types match

此时,直接引用函数名等效于在函数名上应用取地址操作符:

cmpfcn pf1 = lengthcompare;

cm[fcn pf2 = &lengthcompare;

记住:函数指针只能通过同类型的函数或者函数指针或0值常量表达式进行初始化或赋值。

将函数指针初始化为0,表示该指针不指向任何函数。

指向不同函数类型的指针之间不存在转换:

string::size_type sunlength(const string &, const string &)'

bool cstringcmpare(char *, char *);

cmpfcn pf;

pf = sunlength;     //error:return type deffers

pf = cstringcompare;//error:parameter types differ

pf = lengthcompare; //ok:function and pointer types match exactly

(3)通过指针调用函数

指向函数的指针可用于调用它指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数:

cmpfcn pf = lengthcompare;

lengthcompare("hi","bye");

pf("hi", "bye");

(*pf)("hi", "bye");

(4)函数指针形参

函数的形参可以是指向函数的指针。这种形参可以用以下两种形式编写:

void useBigger(const string &, const string &,bool (const string &, const string &));

void useBigger(const string &, const string &, bool (*)(const string &, const string &));

(5)返回指向函数的指针

函数可以返回指向函数的指针,但是,正确的写出这种返回类型相当不容易:

int (*ff(int))(int *, int *);

提醒:阅读函数指针声明的最佳方式是从声明的名字开始由里而外理解。

要理解该声明的含义,首先观察:

ff(int)

将ff声明为一个函数,它带有一个int型的参数。该函数返回

int (*)(int *, int);

它是一个指向函数的指针,所指向的函数返回int型并带有两个分别为int *型和int型的形参。使用typedef可使该定义更简明易懂:

typedef int (*pf)(int *, int);

pf ff(int);

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

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

相关文章

ppt里quicktime不可用_十大好看又实用的PPT网站

现在的社会做PPT差不多快成家常便饭了开题报告、毕业答辩、汇报总结、讲课等等但就是找不到好的模板你知道好看又实用的PPT模板要去哪里找吗下面小编就将为大家呈现几款实用的软件及网站其中海量资源&#xff0c;等你发现请跟着小编向下看Top1.PPT美化大师资源广场这是个小软件…

layui 开启关闭标签_欧盟发布照明产品ErP及能效标签法规新草案

欧盟ERP指令从09年发布后经历了多次的标准内容更新&#xff0c;对管控产品的要求也越来越严格。近日&#xff0c;欧洲委员会发布了照明产品ErP及能效标签法规的新草案&#xff0c;旨在取代现行ErP法规EC 244/2009、EC245/2009、EU1194/2012和能效标签法规EU874/2012。新草案里规…

tablets计算机英语,计算机专业英语词汇

下面是秋天网 Qiutian.ZqNF.Com小编为大家带来的计算机专业英语词汇&#xff0c;欢迎大家学习!计算机专业英语词汇&#xff1a;1、parallel port 并行端口parallel port enables microcomputer users to connect to a parallel printer.并行端日使微机用户能与并行打印机相连接…

ae连续流动的线条_贡献 | AE片头制作绝对经验

在视频制作中,AE是必不可少的一款特效制作软件&#xff01;关于AE片头制作&#xff0c;每个人都有自己的一套经验和方法&#xff01;在这里E哥就找到了一篇文章&#xff01;仅供个人制作参考&#xff01;内容如下&#xff1a;1:闪白:通常我不会直接使用白帧叠化,而且在原素材上…

vue 限制渲染条数_深入理解Vue 的条件渲染和列表渲染

这两天学习了Vue.js 感觉条件渲染和列表渲染知识点挺多的&#xff0c;而且很重要&#xff0c;所以&#xff0c;今天添加一点小笔记。条件渲染v-if在 < template > 中配合 v-if 渲染一整组在使用 v-if 控制元素的时候&#xff0c;我们需要将它添加到这个元素上去。然而如果…

此计算机到未能识别网络连接,本地连接显示“未识别的网络”

你好&#xff01;不能上网的原因有很多&#xff1a;1 使用的是mode直接上网还是通过mode再连接路由器上网&#xff1f;如果只是通过mode上网&#xff0c;就是拨号上网&#xff0c;如果不能连接会有提示&#xff0c;直接打电信询问就可以了。(有可能是到mode的线路有问题&…

python打开文件_用Python(in PsychoPy)打开SPSS数据文件

用Python(in PsychoPy)打开SPSS数据文件有时&#xff0c;要访问SPSS的sav文件中的内容&#xff0c;而手里电脑没有SPSS软件&#xff0c;或者需要对SPSS数据文件中的数据进行SPSS支持不够好的操作&#xff0c;如对一组数据反复多次抽样。可以使用Python中的Pandas模块来访问SPSS…

python 操作系统学习_操作系统学习

一、操作系统庄园主——奴隶&#xff0c;找一个管家来传达命令。计算机的世界中叫做操作系统&#xff0c;这个管家就相当于少掉的内存。操作系统帮我们把内容保存到硬盘&#xff0c;帮我们解析指令。二、操作系统都干了什么&#xff1f;接收外部指令转化成0和1。翻译成你写的字…

计算机科学与技术毕业答辩流程,计算机科学与技术学院毕业答辩工作细则

计算机科学与技术学院毕业答辩工作细则为保证毕业生毕业论文答辩的顺利进行&#xff0c;提高毕业答辩质量&#xff0c;现对毕业答辩工作具体操作细节作如下规定&#xff1a;一、答辩论文标准1.论文文题相符、观点明确、论证充分、结论合理、格式规范。2.论文题目变更&#xff0…

iphone黑屏转圈_iphone8一直在黑屏转圈

iPhone8手机开不了机一直在黑屏转圈现象怎么办&#xff1f;一般情况我们会建议手机进行强制重启&#xff0c;但是手机黑屏转圈不开机的故障原因有很多&#xff0c;我们需要一步一步来分析&#xff0c;最后能更有针对性地去解决问题。下面就来和大家说说iphone8一直在黑屏转圈开…

forager有多少个机器人_诠视科技:VSLAM技术进展让移动机器人自主行驶有了更广阔的空间...

图&#xff1a;诠视科技CEO 林琼在移动机器人领域&#xff0c;2018年最大的技术进展莫过于VSLAM技术在该领域的应用突破了&#xff0c;它将让移动机器人自主行驶有更广阔的空间。目前市面上移动机器人自主行驶都是以激光雷达导航为主&#xff0c;双目视觉只是作为辅助使用&…

计算机没有设置无线临时网络,如何创建临时无线网络

1、选择性能高的笔记本做主机在参战笔记本中选一台性能比较高的笔记本做“主在系统右下角的任务栏托盘区中找到网络连接的图标&#xff0c;右键选择“网络和共享中心”。同样的&#xff0c;也可以在Win7的控制面板中进入无线和共享中心&#xff0c;效果是一样的。2、设置无线临…

买电脑主要看什么配置_买笔记本电脑主要看什么? 配置要什么样的才算好?...

买笔记本电脑主要看CPU、显卡、主板、内存、硬盘等硬件的性能参数&#xff0c;当然最关键的是考虑您的使用用途和准备的预算&#xff0c;尽量在预算允许的范围内针对性的选择&#xff0c;不要造成性能的浪费。以下是详细介绍&#xff1a;1、硬件设备的性能是决定电脑优劣的关键…

继电器触点粘连分析_在我们日常电气维护中如何避免由于继电器触点粘连造成的设备故障...

在我们日常电气维护中常常会遇到由于继电器触点粘连而造成的设备动作异常或误动作的情况&#xff0c;尤其是一些运行时间较长的设备&#xff0c;而继电器在我们日常维护检查中很难提前预判到触点是否粘连&#xff0c;而继电器触点异常就会造成设备的动作异常&#xff0c;极易造…

计算基因组学需要计算机知识吗,生物信息学——计算基因组学的一些参考书

有两个都可以在新浪爱问资料Bioinformatics.For.Dummies.2nd.Ed.2007.pdfAn Introductionto Bioinformatics Algorithms.pdf另外看到 Virginia 大学的一些课程The 2012 Computational Genomics Course has been rescheduled toNovember 28 - December 4, 2012用mothur从*.sff进…

神舟笔记本风扇控制软件_十代酷睿+RTX2070加持 高性能游戏本首选神舟战神G9CU7PK...

说起最近的真香游戏本产品&#xff0c;我心中立马浮现出神舟战神G9-CU7PK游戏本&#xff0c;这是一款从基础硬件到整体细节都属于一步到位的高端游戏笔记本。神舟战神G9-CU7PK其最大特点是搭载了NVIDIA GeForce RTX 2070独立显卡&#xff0c;其基于NVIDIA Turing GPU架构&#…

python 读取地震道头数据_【Python】OGR库(1):读取矢量数据

OGR库是一个非常流行的处理地理空间矢量数据的开源库。它可以读取丰富的数据格式&#xff0c;允许用户进行几何处理、属性表操作、数据分析&#xff0c;是个非常强大的开源GIS库。目前OGR已集成在GDAL库中&#xff0c;可以说是GIS的本源之一了&#xff0c;有大量的软件用到了这…

进入其他网络共享计算机,局域网内如何进入其他电脑,两个电脑利用无线建立局域网-...

虽然大家平时都在使用电脑&#xff0c;但是大家中的相当一部分朋友们从来都没想过应该如何通过局域网进入到别人的电脑这个问题。怎么样?听起来是不是很神奇呢?其实这种方法从电脑能狗互联的时候就已经诞生了&#xff0c;只是大家一般不经常使用这种工具&#xff0c;所以就不…

spssχ2检验_卡方检验与单因素logistic回归分析结果比较

在疾病或健康的流行病学研究中,经常需要分析疾病或健康状态与各种影响因素(保护因素或危险因素)的之间的定量关系,由于疾病或健康状态是分类变量,一般采取logistic回归分析。 在做此类数据分析时,对分析疾病或健康状态与单个影响因素之间的关系分析时,直接用卡方检验还是…

appcrash事件怎么解决_解决问题的最佳办法,是让问题不再是问题

我们常常陷入迷局&#xff0c;绕来绕去却怎么也找不到出路。因为&#xff0c;当事者迷&#xff0c;旁观者清。身在局中&#xff0c;我们的思维很容易就被固定在既定的逻辑里。有的是以往的经验总结&#xff0c;有些是从他人处习得。对于我们已经习得的东西&#xff0c;在遇到事…