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美化大师资源广场这是个小软件…

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

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

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

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

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

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

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

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

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

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

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

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

神舟笔记本风扇控制软件_十代酷睿+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;所以就不…

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

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

台式计算机的硬件组成部分,台式电脑主机的硬件组成部分简介

计算机硬件系统中用于放置主板及其他主要部件的容器(Mainframe)。通常包括 CPU、内存、硬盘、光驱、电源、以及其他输入输出控制器和接口&#xff0c;如 USB 控制器、显卡、网卡、声卡等等。位于主机箱内的通常称为内设&#xff0c;而位于主机箱之外的通常称为外设(如显示器、键…

python 伪造源ip_Swaks伪造邮件

0x00 swaksswaks - Swiss Army Knife SMTP, the all-purpose smtp transaction tester.swaks堪称SMTP协议的瑞士军刀&#xff0c;使用它我们可以灵活的操作SMTP协议报文&#xff0c;这篇文章主要是记录一下我是如何伪造一封邮件绕过gmail的检测。通常最简单的发送命令&#xff…

clientmacaddr进不去系统win10_教你一分钟搞定戴尔电脑WIN10改WIN7

最近有很多人问小编&#xff0c;戴尔的新款电脑WIN10(win8)改WIN7电脑不认U盘&#xff0c;不知道怎么设置&#xff0c;今天小编就给大家分享一个快速进入的方法。首先把装有系统的U盘插入电脑&#xff0c;开机一直按F12进入Bios菜单第二步&#xff1a;进入菜单界面后&#xff0…

win7笔记本外接显示器html,window7笔记本外接显示器只显示一个屏幕怎么设置

许多用户都会偏向于入手win7笔记本电脑&#xff0c;这样电脑携带起来也是非常方便&#xff0c;不过由于屏幕较小的缘故&#xff0c;有用户就会选择外接一台显示器&#xff0c;不过在给win7笔记本外接显示器之后就需要对于其进行设置只显示一个屏幕&#xff0c;接下来小编就来教…

苹果手机怎么查看足迹_用了5年苹果手机!才知道查看一个字母就能辨别手机真假...

苹果手机的价格一般都比较贵&#xff0c;所以大家都怕买到假货&#xff01;今天笔者就教大家如何快速分辨苹果手机真假&#xff0c;只需查看一个字母就能知道手中的苹果手机是什么型号。方法一&#xff1a;桌面图标iPhone手机桌面上的时钟图标比较特别&#xff0c;它的时针会随…

java实现矩阵谱峰搜索算法

矩阵谱峰搜索算法&#xff0c;也称为矩阵谱峰查找算法&#xff0c;是一种用于搜索二维矩阵中谱峰的方法。谱峰是指在矩阵中的一个元素&#xff0c;它比其上下左右四个相邻元素都大或相等。 该算法的基本思想是从矩阵的中间列开始&#xff0c;找到该列中的最大元素&#xff0c;…

电脑中计算机右键管理无法打开,win8系统计算机右键菜单中的管理打不开怎么办...

‍‍计算机管理一组Windows管理工具&#xff0c;这些工具被组合到一个控制台中&#xff0c;方便我们操作。最近有些雨林木风win8旗舰版用户遇到了计算机管理打不开的情况&#xff0c;在右键点击计算机打开菜单后&#xff0c;点击管理打不开&#xff0c;遇到这种问题该怎么办呢&…

中海达gps软件wince_应用|无人机航测15分钟能做啥?中海达PPK告诉你答案

标星置顶&#xff0c;一秒找到中海达讯点击上方“中海达讯”→点击右上角“…”→点选“设为星标 ★”在航测作业中快速现场成图生成快拼成果报告快速通过内方位元素精度评估完成以上步骤你最快要多长时间&#xff1f;15分钟这是中海达PPK套装给出的答案点击视频查看中海达PPK套…

机械制造工艺基础_机械制造工艺基础知识,錾削与锯削加工工艺

一、錾削用锤子打击錾子对金属工件进行切削加工1&#xff0e;錾削工具(1)錾子錾子的种类及用途(2)锤子2&#xff0e;錾削时的几何角度(1)楔角(βo)錾削硬度较高材料&#xff1a; βo60&#xff5e;70錾削软材料&#xff1a;βo30&#xff5e;50錾削中等硬度材料&#xff1a;βo…