四、函数重载和函数指针

2018-06-03  本文已影响0人  木鱼_cc

函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。

在C语言中,无法实现重载,只能使用函数指针

void func(int a)
{
   cout<<"func"<<endl;
   cout<<a<<endl;
}

int main(void)
{
   //定义一个 指向void func(int a)的函数指针
   void (*fp)(int) = func;//fp就是执行void()(int)这种函数类型的指针
   //第二个()代表指定参数类型
   fp(10);

}

1.重载规则

//函数重载,就是对参数列表的变换,不是函数返回值的变化
//返回值必须一样,参数列表不同,并且函数名相同的函数都是重载函数
//如果说函数重载加上了默认参数,并且函数名相同,就出现二义性
//记住:函数重载最好不要有默认参数
void func(int a);//ok
void func(char a);//ok
void func(char a,int b);//ok
void func(int a, char b);//ok
char func(int a);//与第一个函数有冲突

2.调用准则

编译器调用重载函数的准则:

精确匹配实参

匹配失败

3.重载底层实现(name mangling)

C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。

实现原理:用vcifld表示 **void char int float long double **及其引用。

void func(char a);//func_c(char a)
void func(char a,int b, double c);//func_cid(char a, int b, double c)

4.函数指针

定义函数指针
void func(int a,int b)
{
   cout<<a<<b<<endl;
}

void func(int a,int b,int c)
{
   cout<<a<<b<<c<<endl;
}

void func(int a,int b,int c,int d)
{
   cout<<a<<b<<c<<d<<endl;
}

//1.定义一个函数类型
typedef void(myfunctype)(int ,int);//定义一个函数类型,返回值是void,参数列表是int,int,  void()(int,int)

//2.定义一个函数指针类型
typedef void(*myfunctype_pointer)(int,int);//定义了一个函数指针类型,返回值是void,参数列表是int,int,  void()(int,int)

int main(void)
{
   //1.定义一个函数指针
     myfunctype *fp1 = NULL;
     fp1 = func;
     fp1(10,20);

    //2.定义一个函数指针
     myfunctype_pointer fp2 = NULL;
     fp2 = func;
     fp2(10,20);

    //3.直接定义一个函数指针
     void(* fp3)(int,int) = NULL;
     fp3 = func;
     fp3(10,20);

     cout<<"---------------------------------------------"<<endl;

    //此时fp3是void(*)(int,int)
//    fp3(10,20,30,40);//fp3是恒定指向一个函数入口,值指向了(int,int)
//    fp3(10,20,30);//想通过函数指针,发生函数重载,是不可能的!!
    fp3(10,20);

     void(* fp4)(int,int,int) = func;//在对函数指针赋值的时候,函数指针会根据自己的类型,找到一个重载函数
     fp4(10,10,10);
     return 0;
}

5.重载总结

上一篇 下一篇

猜你喜欢

热点阅读