函数的重载

来源:互联网 发布:数据库关键字查询 编辑:程序博客网 时间:2024/06/01 07:27

函数的重载

#include "stdafx.h"#include <iostream>using namespace std;#if 0----重载规则:1,函数名相同。2,参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。3,返回值类型不同则不可以构成重载 //如果类型不同,而且不计较函数的返回,只是调用 如func(); //则系统很难判断出选择出重载中的哪个函数进行调用----匹配原则:1,严格匹配,找到则调用。2,通过隐式转换寻求一个匹配,找到则调用//隐式转换就是一些 短的类型可以转换成长的类型 如int可以转为//long和double而长的类型不能隐式转换为短的类型 因为可能会损失精度----命名倾轧 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"{}#endifvoid 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;}