函数重载
C++允许在同一作用域中一个函数名定义多个函数,这些函数就构成了函数重载。其中①参数个数、②类型、③顺序,④关键字const都可以作为重载的依据,而参数名称(看后面反汇编文件的函数名与参数的关系即可知道)与返回值(暂且可以这么理解:返回值有时可以忽略,所以无法判断是哪个函数,干脆禁止这种操作)不能作为重载依据。看例子验证一下:
#include <iostream>
using namespace std;
void func(int i);
void func(double d);
void func(int i, double d);
void func(double d, int i);
// int func(double d, int i); // 返回值不能作为重载的依据,编译时出错
class test{
public:
void func(void)
{
cout << "no const" << endl;
}
void func(void) const
{
cout << "const" << endl;
}
};
int main()
{
// 参数个数、类型、顺序
func(100);
func(100.0);
func(100, 100.0);
func(100.0, 100);
// const还有多种情况,这里只列举类成员函数
test t1;
t1.func();
const test t2;
t2.func(); // 常对象只能调用常函数
return 0;
}
void func(int i)
{
cout << "int" << endl;
}
void func(double d)
{
cout << "double" << endl;
}
void func(int i, double d)
{
cout << "int n double" << endl;
}
void func(double d, int i)
{
cout << "double n int" << endl;
}
/*
int func(double d, int i)
{
cout << "double n int" << endl;
}
*/
在Linux环境下使用g++ overload.cpp -o overload
编译程序并且执行./overload
命令运行程序查看输出:
int
double
int n double
double n int
no const
const
之所以可以允许定义多个同名函数,执行命令objdump -d overload > overload.dis
反汇编查看一下vi overload.dis
就知道,红色框框就是这些重载函数被“翻译”的结果,所以经过编译之后函数名就不是一样的了,框中的函数名后缀的i和d是参数类型的简写而不是参数名称(可以更改参数名进行验证)。程序中调用同名函数时就会根据以上四个重载依据调用不同函数:
.
.
extern “C”
C++支持重载,而C不支持,也正是因为这个原因导致两者对同一函数的命名会不同。所以为了兼容C的代码,C++程序可以加上extern "C"进行处理:
#ifdef __cplusplus // cpp文件默认定义了该宏
extern "C"{ // 采用C的方式编译这部分代码
#endif
// C代码
#ifdef __cplusplus
}
#endif
如果感兴趣,可以对比cpp文件加上跟去掉extern "C"的汇编文件,对比一下两者对应的函数名。