重载与带默认参数的函数

重载与带默认参数的函数

相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载 overload
函数重载又称为函数的多态性,这种多态性称为静态的多态性。动态的多态性表现为派生类并且基类为虚函数,这是一种动态绑定。静态的多态在编译时确定函数的入口地址,称为静态联编。动态的多态在运行时决定函数的入口地址,也称为动态联编。
函数重载不同形式:
  • 形参数量不同
  • 形参类型不同
  • 形参的顺序不同
  • 形参数量和形参类型都不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数

合法的重载例子:
int abs(inti);
long abs(long l);
double abs(double d);
非法的重载例子:
int abs(int i);
long abs(int i);
void abs(int i);

//如果返回类型不同而函数名相同、形参也相同,则是不合法的,编译器会报"语法错误"

name managling与extern“C”

  • name managling这里把它翻译为名字改编。
  • C++为了支持重载,需要进行name managling
  • extern “C”实现C与C++混合编程,extern "C"表示不进行名字改编,按C语言的方式解释函数名,C语言不支持函数重载,如果希望写的函数能够被C语言调用,加上extern "C",如:
    extern "C" void fun(int a);
    注意加上extern "C"  后不支持重载
#ifdef __cpluscplus
extern “C”
{
#endif
...
#ifdef __cpluscplus
}
#endif
#ifdef __cpluscplus
extern "C"
{
#endif
void fun(int a)
{
	cout<<"xxxx"<<endl;
}
void fun2(double a)
{
	cout<<"yyyy"<<endl;
}
#ifdef __cpluscplus
}
#endif

带默认形参值的函数

  • 函数声明或者定义的时候,可以给形参赋一些默认值
  • 调用函数时,若没有给出实参,则按指定的默认值进行工作
  • 函数没有声明时,在函数定义中指定形参的默认值
  • 函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值

默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值。
void func1(inta, double b=4.5, int c=3); //合法
void func1(inta=1, double b, int c=3); //不合法

函数调用时,实参与形参按从左到右的顺序进行匹配

重载的函数中如果形参带有默认值时,可能产生二义性
int add(int x=5, int y=6); 
int add(int x=5, int y=6, int z=7); 
int main() { 
	int sum;
	sum= add(10,20); 
	return 0;
}
int add(int x, int y) 
{ 
       return x+y; 
} 
int add(int x,  int y, int z) 
{ 
       return x+y; 
}

sum=add(10,20)语句产生二义性性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数


猜你喜欢

转载自blog.csdn.net/alatebloomer/article/details/80045224