函数重载的规则:
- 函数名称必须相同
- 同作用域
- 形参必须不同(形参个数不同、形参类型不同、形参排列顺序不同等)
- 调用点只能看到函数名和传入的参数
- 返回类型不同不足以成为函数重载的依据(因为函数的返回类型可以相同也可以不相同)
函数重载的作用:
- 重载函数通常用来在同一个作用域内用同一个函数名命名一组功能相似的函数
- 这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处
函数重载是一种静态多态:
- 多态:同一接口,不同形态
- 多态分为:
- 静态多态(编译时的多态)
- 动态多态(运行时的多态)
符号生成规则:
C语言中:
- 编译器在编译.c文件时,只会给函数进行简单的重命名
- 具体的方法是给函数名之前加上”_”
- 所以加入两个函数名相同的函数在编译之后的函数名也照样相同
- 调用者会因为不知道到底调用那个而出错
C++中:
- 在.cpp文件中,虽然两个函数的函数名一样,但是他们在符号表中生成的名称不一样。
- ‘?’表示名称开始
- ‘?’后边是函数名“@@YA”表示参数表开始
- 后边的3个字符分别表示返回值类型,两个参数类型
- “@Z”表示名称结束
由于在.cpp文件中,两个函数生成的符号表中的名称不一样,所以是可以编译通过的
所以C++支持函数重载,而C语言不支持
new关键字
- 调用operator new[](size_t size)开辟,调用构造
- operator new可以重载
- size记录首地址和开辟内存的大小
malloc函数
- 不可以重载
- new可以调用malloc,malloc不能调用new
- new调用构造,可以自己实现,也可以调用系统
- new可以开辟常量内存块
const int *p = new const int (20);
Test * ptest = new Test [10];
delete ptest;
C/C++的相互调用
C++调用C:
- 在 .cpp 文件中加 extern"C"(把包含的代码以C的规则进行处理)
C调用C++:
- C++源文件可以修改: .cpp 加 extern"C"
- C++源文件不可以修改:加中间层
.c(源文件)
extern int Sum (int , int) extern int MySum (int , int)
->
Sum (10 , 20); MySum (10 , 20);
.cpp(中间层)
int MySum (int a , int b) extern "C"
{ int MySum (int a , int b)
return Sum (a , b); -> {
} return Sum (a , b);
}
.cpp(不可修改的.cpp文件)
Sum (int a , int b) int Sum (int a , int b)
{ {
Sum (int , int); -> return a + b;
} }