重载:(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语言的函数命名格式