能使名字方便使用,是任何程序设计语言的一个重要特征
同样一个字在不同的场景下具有不同的含义。那么在C++中也有一种类似的现象出现,同一个函数名在不同的场景下可以具有不同的含义
在传统的C语言中,函数名必须是唯一的,程序中不允许出现同名的函数。在C++中是允许出现同名的函数,这种现象称之为函数重载
函数重载的目的就是为了方便的使用函数名
int add(int a,int b)
{
return a + b;
}
int add(double a, double b)
{
return a + b;
}
注意:
void func()
{
cout<<"func()"<<endl;
}
void func(int a)
{
cout<<"func(int a)"<<endl;
}
void func(int a)
{
cout<<"func(int a)"<<endl;
}
void func(char c)
{
cout<<"func(char c)"<<endl;
}
void func(int a,double b)
{
cout<<"func(int a,double b)"<<endl;
}
void func(double a,int b)
{
cout<<"func(double a,int b)"<<endl;
}
调用重载函数的注意:
int a = 1;
double b = 3.1;
func();
func(a,b);
func(b,a);
char c = 'c';
func(c);// char 转换int成功 调用int参数的函数
#include
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
// 函数重载和函数默认参数一起使用 会产生二义性问题
void myFunc(int a, int b = 0)
{
cout << "myFunc(int a,int b = 0)" << endl;
}
void myFunc(int a)
{
cout << "myFunc(int a)" << endl;
}
void test02()
{
//myFunc();// 二义性问题 编译器不知道调用哪一个函数
}
int main()
{
test02();
return EXIT_SUCCESS;
}
函数重载的原理是在汇编时,给每一个函数取别名,C语言不能重载的原因是没有取别名
汇编命令:g++ -S hello.cpp -o hello.s
测试代码
#include
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
// 函数重载和函数默认参数一起使用 会产生二义性问题
void myFunc(int a, int b = 0)
{
cout << "myFunc(int a,int b = 0)" << endl;
}
void myFunc(int a,double b)
{
cout << "myFunc(int a)" << endl;
}
void test02()
{
myFunc(1,1.0);// 二义性问题 编译器不知道调用哪一个函数
}
int main()
{
test02();
return EXIT_SUCCESS;
}
汇编命令:


我们可以清楚的看到汇编文件中,编译器给两个函数起了不一样的名字!!!
C++的函数在汇编时候,会给函数取别名,C语言的不会,这时,如果C++来调用C语言的函数,C++会找取了别名的函数,但是C语言没有取别名,这是就会出错
main.cpp
#include
using namespace std;
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include"test.h"
int main()
{
func();// 没办法找C语言中的函数
return EXIT_SUCCESS;
}
test.h
#pragma once
#include
// 告诉C++编译器 找下面的函数 要以C语言的方式取去寻找
#ifdef __cplusplus
extern "C"
{
#endif
void func();
#ifdef __cplusplus
}
#endif
test.c
#pragma once
#include"test.h"
void func()
{
printf("func");
}