为什么C++可以重载函数

重载:(overload)

所谓函数重载:多个函数名称相同的函数

同一个标识符在不同的上下文有不同的意义

如:

“洗”和不同的词汇搭配后有不同的含义

—洗衣服,洗脸,洗脑,。。。

play和不同的单词搭配后会有不同的含义

  — lay chess, play piano, play basketball 。。。

函数重载至少满足下面的一个条件:

1)参数个数不同   2)参数类型不同   3)参数顺序不同

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

1)将所有同名函数作为候选者   2)尝试寻找可行的候选函数

1、精确匹配实参

2、通过默认参数能够匹配实参

3、通过默认类型转换匹配实参

匹配失败

最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

无法匹配所有候选者,函数未定义,编译失败。

函数重载的注意事项

1)重载函数在本质上是相互独立的不同函数

2)重载函数的函数类型是不同的

3)函数返回值不能作为函数重载的依据

函数重载是由函数名和参数列表决定的。

函数重载与函数指针

当使用重载函数名对函数指针进行赋值时

根据重载规则挑选与函数指针参数列表一直的候选者

严格匹配候选者的函数类型与函数指针的函数类型

为什么C++支持函数重载呢???

我们都知道C语言不支持函数重载,而C++支持函数重载的原理如下:

C++源码

#include<stdio.h>

int add(int a, int b)
{
return(a+b);
}
int add(int a, float b)
{
return(a+b);
}
int main(int argc, const char *argv[])
{
int a = 10;
int b = 20;
printf("a + b = %d\n", add(a, b));
return 0;
}

C++反汇编

	.file	"add.c"
	.text
	.globl	_Z3addii
	.type	_Z3addii, @function
_Z3addii:				/* _Z3addif中的add表示为C++语言中的函数名称,而后面的两个 i ,则表示该函数的参数类型都为int */
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	movl	12(%ebp), %eax
	movl	8(%ebp), %edx
	addl	%edx, %eax
	popl	%ebp
	.cfi_def_cfa 4, 4
	.cfi_restore 5
	ret
	.cfi_endproc
.LFE0:
	.size	_Z3addii, .-_Z3addii
	.globl	_Z3addif
	.type	_Z3addif, @function
_Z3addif:				/* _Z3addif中的add表示为C++语言中的函数名称,而后面的 i 和 f ,则表示该函数的参数类型分别为int和float*/
.LFB1:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$8, %esp
	fildl	8(%ebp)
	fadds	12(%ebp)
	fnstcw	-2(%ebp)
	movzwl	-2(%ebp), %eax
	movb	$12, %ah
	movw	%ax, -4(%ebp)
	fldcw	-4(%ebp)
	fistpl	-8(%ebp)
	fldcw	-2(%ebp)
	movl	-8(%ebp), %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE1:
	.size	_Z3addif, .-_Z3addif
	.section	.rodata
.LC1:
	.string	"a + b = %d\n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB2:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$32, %esp
	movl	$10, 24(%esp)
	movl	$20, 28(%esp)
	movl	28(%esp), %eax
	movl	%eax, 4(%esp)
	movl	24(%esp), %eax
	movl	%eax, (%esp)
	call	_Z3addii
	movl	%eax, 4(%esp)
	movl	$.LC1, (%esp)
	call	printf
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE2:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits

从上述反汇编代码中可以看出C++中的函数命名格式为:“头+函数名称+函数参数类型的首写字母”

注意:C++函数名称的命名规则都有一定的格式规则,不同于C语言的函数命名格式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值