重载规则:
1.函数名相同
2.参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
3.只是返回值类型不同则不可以构成重载 ,如果只是类型不同,而且不计较函数的返回,只是调用 如func(),则系统很难判断出选择出重载中的哪个函数进行调用
4.使用const修饰的类成员函数与普通类成员函数(详细见const修饰类成员函数)
匹配原则:
1.严格匹配,找到则调用
2.通过隐式转换寻求一个匹配,找到则调用,隐式转换就是一些短的类型可以转换成等长或者长的类型,如int可以转为long和double,而长的类型不能隐式转换为短的类型,因为可能会损失精度
#include "stdafx.h"
#include <iostream>
using namespace std;
void print(long a)
{
cout << "void print(long a)" << endl;
cout << "a=" << a << endl;
}
void print(double a)
{
cout << "void print(double a)" << endl;
cout << "a=" << a << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
print((long)1); print(1l);//后面加l进行类型控制
//如果为 print(1);则会报错 因为1为int类型 int可以
//隐式转为long或者double 与上面函数 产生二义性
return 0;
}
命名倾轧 name mangling:
1.C++利用 name mangling(倾轧)技术来改名函数名,区分参数不同的同名函数(不同名的函数也会发生倾轧)
2.name mangling 发生在两个阶段,.cpp 编译阶段,和.h 的声明阶段,只有两个阶段同时进行,才能匹配调用(也就是.cpp和.h中的函数要都倾轧或者都不倾轧才能连接上,才能通过运行)
void func(char a); // func_c(char a)
void func(char a, int b, double c); //func_cid(char a, int b, double c)
extern "C"(避免倾轧):
c++ 完全兼容 c 语言,那就面临着,完全兼容 c 的类库。由于.c 文件的类库文件中函数名,并没有发生 name manling 行为,而C++编译器在包含.c 文件所对应的.h 文件时,.h 文件要发生 name manling 行为,因而在链接的时候会发
生错误。 C++为了避免上述错误的发生,重载了关键字 extern。只需要在要避免 name manling 的函数前,加 extern "C" 如有多个,则 extern "C"{}