C++知识点9——函数重载,默认实参,内联函数

函数重载

同一作用域内函数名相同但是形参列表不同的函数,为重载函数

 

下面两个函数就是重载函数,编译时会根据形参列表将这两个函数编译成不同的函数,在调用时传入对应的参数就可以调用不同的重载函数

void overloadfunc(int a[10], int len);
void overloadfunc(int *s, int *e);

int main(int argc, char const *argv[])
{
	int a[6]={10,9,7};
	overloadfunc(a,5);
	overloadfunc(a, a+sizeof(a)/sizeof(int));
	return 0;
}

void overloadfunc(int a[], int len)
{
	cout<<"overloadfunc(int a[], int len)"<<endl;
}

void overloadfunc(int *s, int *e)
{
	cout<<"overloadfunc(int *s, int *e)"<<endl;
}

 

注意:如果两个函数的函数名相同,形参列表也相同,只是返回值不同,那么在调用该函数时会报错

void overloadfunc(int *s, int *e);
int overloadfunc(int *s, int *e);

所以函数是否重载与返回值无关,两个函数除了返回值不同,其余均相同时,编译时会报二义性错误

 

函数重载与const

拥有修饰形参本身的const的形参无法和一个没有const修饰的形参区分出来

int main(int argc, char const *argv[])
{
	int a=7;
	overloadfunc(a);
	return 0;
}

void overloadfunc(int c)
{
	cout<<"overloadfunc(int c)"<<endl;
 }

void overloadfunc(const int c)
{
	cout<<"overloadfunc(const int c)"<<endl;
}

当编译上述代码时,会提示函数重定义,因为当把a传入overloadfunc时,既能匹配void overloadfunc(int c),也能匹配void overloadfunc(const int c),因为const int和int都能用一个常量字面值初始化

编译器不知道要调用哪个函数,所以将这两个函数视为同一个,报重定义错误

 

如果const修饰的是形参所指向或者绑定的对象,而不是形参本身,那么就可以将重载函数区分出来

int main(int argc, char const *argv[])
{
	int a=7;
	overloadfunc(a);
	overloadfunc(7);
	return 0;
}

void overloadfunc(int &c)
{
	cout<<"overloadfunc(int &c)"<<endl;
}

void overloadfunc(const int &c)
{
	cout<<"overloadfunc(const int &c)"<<endl;
}

调用overloadfunc(a)时,会有限匹配overloadfunc(int &c),当传入一个常量值时,只有overloadfunc(const int &c)能接受该实参,所以匹配overloadfunc(const int &c)

所以,当const修饰的是形参所指向或绑定的对象,而不是形参本身时,将生成两个不同的函数

 

不要滥用重载函数

void overloadfunc(int c){}
void overloadfunc(const int &c){}
void overloadfunc(int &){}

int main(int argc, char const *argv[])
{
	int a=7;
	overloadfunc(a);
	return 0;
}

上述代码定义的三个重载函数并且在主函数中调用重载函数overloadfunc,但是编译器无法判断到底要调用哪个重载函数(因为三个函数都可以接受a作为函数的实参),所以报函数歧义错误

 

默认实参

函数在声明或定义时,对函数的形参进行值初始化,而在调用时,可以对该形参重新初始化,也可以忽略对该形参初始化

void defaultpara(int a,int b=10);
void defaultpara(string str=" ");

int main(int argc, char const *argv[])
{
	defaultpara(10);
	defaultpara(10,20);
	defaultpara();
	defaultpara("123");
	return 0;
}

void defaultpara(int a, int b)
{
	cout<<"defaultpara(int a, int b)"<<endl;
}

void defaultpara(string str)
{
	cout<<"defaultpara(string str)"<<endl;
}

调用函数时,如果想使用默认实参,就直接忽略对形参的初始化,否则,传入新的实参即可

 

默认实参只能在函数声明或者定义时进行添加,二者选其一,否则报错

 

内联函数

内联函数主要修饰用在短小,实现简单的函数,用inline修饰该函数

inline void defaultpara(string str=" ");

内联函数在调用点直接将函数展开,减少函数调用的次数和开销,从而让程序速度更快,所有在类的内部定义实现的函数都是内联函数

 

参考:

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值