一,哑元函数:一个函数的参数只有类型没有名字的则这个参数称之为哑元。类似于void fun(int);

功能:1保持向前的兼容性,比方说我们需要做成一个成品,然后成品是会不断的更新第一代第二代,当我们改进内容的时候新用户和老用户可能会有冲突,我们这个时候就利用哑元函数来保持兼容性;

2.做函数的区分:T operator++(){}; T oprintor++(int){};

3.使表达参数列表匹配的更加严格,更容易区分重载版本;

下面这个代码就是充分验证了更严格的区分了重载函数:

namespace Yayuan{
void fun(int a,double b){
cout<<"fun1:"<<a<<endl;
}
void fun(int a,double b,int){
cout<<"fun2:"<<a<<endl;
}
}//两个函数的用法都是一样的,只是第二个利用了哑元函数进行区分

是吧,如果没有第二个函数最后的int系统会报错,无法区分这两个函数,而有了哑元函数就能帮我们实现函数的区分。哑原函数在我们真正处理C++问题的时候也会有实际的应用(运算符重载),运算符重载只能利用哑元来区分它了;

二,缺省参数:如果函数的形参有缺省值,当函数调用时没有传递实参时,那么形参就使用缺省值,如果调用函数时传递了实参,那么形参就使用实参的值。

注意:1.缺省参数必须靠右原则,如果一个函数有多个参数,且部分参数有缺省值那么缺省值的参数必须靠右(在编译期间确定参数),即使有多个也许堆在右边;

2.如果函数的声明和定义分开,那么缺省函数就只能写在函数声明部分,防止报错;

3.防止重载的冲突(函数调用的歧义);

4.C++中函数的规则,不接受任何参数(否则可能构成重载);

你看下面的代码编译正确,同时也证明了上面我说的注意事项:

#include<iostream>
using namespace std;
void Quesheng(short a,int b=,double c=1.0);//只能写在声明部分,写在定义部分会报错
//一个函数可以定义一个或多个缺省值
/****
void Quesheng(void){//当我使用重载的时候会发生歧义
}
****/
int main(){
Quesheng(,,);//即使有缺省值的参数也能赋值
Quesheng(,);
Quesheng();//重载歧义
getchar();
return ;
}
void Quesheng(short a,int b,double c){
cout<<a<<' '<<b<<' '<<c<<endl;
}

所以说当我们使用缺省值的时候是需要注意这几方面的内容的;

三.内联函数:函数使用inline关键字修饰的函数叫内联函数,函数调用过程:

1.调用后立即存储该存储指令的内存地址;

2.将函数参数复制到堆栈;

3.跳到标记的函数起点的内存单元执行函数代码(可能还有返回值放入到寄存器中)再将返回值弹出然后跳回到地址被保存的指令处;

内联的实质:就是把函数编译好的二进制代码替换成函数的调用指令(省去了调用开销);

其实就是利用空间来换取时间。需要注意的是:

1.类中直接定义的函数被自动的处理成内联函数,所以一般把内联函数放到头文件当中去;

2.inline是一种请求,实现方式取决于编译器,特别是当函数较大或是递归的时候;

我简单写一下形式,再做递归函数的时候定义为内联函数时是无效的,但依旧可以正常运行:

inline int Neilian(int a,int b){
return a+b;
}

我现在也只是讲解了这几种函数的常用方法,以后学的比较深的话我还会继续更新来分别把这三个函数写成单独的博客来介绍。

【C++初学者自学笔记三】哑元函数、缺省参数、内联函数(模块二,PS:需要用到重载函数)的更多相关文章

  1. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  2. 【C++初学者自学笔记二】函数重载(模块一)

    1.概念:同意作用域的一组参数列表不同,函数名相同的函数,这组函数叫函数重载(C语言是不能定义相同名称的函数,但是C++可以允许定义). 2作用:重载函数通常来命名一组功能相似的函数,这样做减少了函数 ...

  3. 初学者自学笔记-this的用法

    请注意:这是自学者的笔记,只是个人理解,并非技术分享,如有错误请指正. "this"的意思,简单而言,就是"这个",也就是"当前".谁调用它 ...

  4. webpack4 自学笔记三(提取公用代码)

    全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonT ...

  5. 【C++初学者自学笔记一】(把自己刚学到的东西做一下总结,如果有哪些地方不足请留言指正)

    这是我写的第一个博客关于C++的一些笔记,我不会写的太深奥,因为这样很多人会看不懂(我刚开始学C语言深受其害).个人觉得C++这门语言有些类似于C语言但是有些函数的用法还是有不一样的.C语言中的头文件 ...

  6. vue 自学笔记(三) 计算属性与侦听器

    一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...

  7. __x__(17)0906第三天__块元素block_内联元素inline_行内块元素inline-block

    1. 块元素block 独占一行的元素 一般使用块元素包含内联元素,用作页面布局 <a> 标签可以包含任何除了a标签以外的元素 <p> 标签不能包含块元素 h1... ...h ...

  8. vue 自学笔记记录

    vue 自学笔记(一): 知识内容:  安装vue ,创建vue实例,安装第一个组件,单项数据流 https://www.cnblogs.com/baili-luoyun/p/10763163.htm ...

  9. C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)

    命名空间 概述 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用域中,可能会导致很多冲突.使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲 ...

随机推荐

  1. GitHub网页版基本操作

    创建存储库 登录GitHub进入主页,点击头像左边的加号,创建存储库 填写存储库名称.描述,根据需求设置其他选项.点击“Create repository”按钮 创建分支 打开之前创建好的存储库,点击 ...

  2. kali 安装与配置

    打开虚拟机 新建一个虚拟机 导入虚拟文件 然后进行下面的步骤 开启虚拟机 语言:中文简体 地区: 中国 语言: 汉语 自动安装 配置网络 配置域名 填写密码(两次一致) 自动校对时钟 使用整个磁盘 选 ...

  3. bugku come_game

    首先打开游戏发现就是一个单纯的游戏但是当你闯过一关去的时候会发现会多一个文件 看一下玩游戏前 与玩游戏之后有什么变化 然后发现一个文件叫temp 然后用hxd进行分析一下然后尝试着将01改成02然后就 ...

  4. 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ...

  5. Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  6. iOS开发之使用 infer静态代码扫描工具

    infer是Facebook 的 Infer 是一个静态分析工具.可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题. 任何人都可以使用 infer 检测应用,可以将严重的 ...

  7. python浅析模块,包及其相关用法

    一,模块 什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里面,代码会越来越长,越来越不容易维护. 为了编写可以维护的代码,我们把很多函数分组,分别放到不同额文件,这样,每个文 ...

  8. nested exception is org.apache.ibatis.binding.BindingException: Parameter 'cons_id' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]

    修改DAO层的类中的方法,如下所示:

  9. Educational Codeforces Round 76 (Rated for Div. 2)E(最长上升子序列)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int a[200007],b[200007] ...

  10. 关于GOM引擎启动时显示:windows socket error: 在其上下文中,该请求的地址无效。 (10049), on API 'bind'

    GOM启动时网管登陆器显示:windows socket error: 在其上下文中,该请求的地址无效. (10049), on API 'bind'解决方法: 重新配置引擎控制台.在配置里取消双IP ...