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

徘徊边缘 提交于 2020-02-09 16:29:05

一,哑元函数:一个函数的参数只有类型没有名字的则这个参数称之为哑元。类似于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=0,double c=1.0);//只能写在声明部分,写在定义部分会报错
//一个函数可以定义一个或多个缺省值/****void Quesheng(void){//当我使用重载的时候会发生歧义}****/
int main(){
    Quesheng(1,12,20);//即使有缺省值的参数也能赋值
    Quesheng(1,12);
    Quesheng(1);//重载歧义
    getchar();
    return 0;
}
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;
}

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!