函数重载实现原理
编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func(); 编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为_func_int,当编译器碰到void func(int x,char c),编译器可能会将函数名修饰为_func_int_char我这里使用”可能”这个字眼是因为编译器如何修饰重载的函数名称并没有一个统一的标准,所以不同的编译器可能会产生不同的内部名。
void func(){}
void func(int x){}
void func(int x,char y){}
以上三个函数在linux下生成的编译之后的函数名为:
_Z4funcv //v 代表void,无参数
_Z4funci //i 代表参数为int类型
_Z4funcic //i 代表第一个参数为int类型,第二个参数为char类型
实现函数重载的条件:
同一个作用域
参数个数不同
参数类型不同
参数顺序不同
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//函数重载
// C++中 函数名称可以重复
// 必须在同一个作用域,函数名称相同
// 函数的参数 个数不同 或者 类型不同 或者 顺序不同
void func()
{
cout << "无参数的func" << endl;
}
void func(int a )
{
cout << "有参数的func(int a)" << endl;
}
void func(double a)
{
cout << "有参数的func(double a)" << endl;
}
void func(double a , int b)
{
cout << "有参数的func(double a ,int b)" << endl;
}
void func(int a, double b)
{
cout << "有参数的func(int a ,double b)" << endl;
}
//返回值可以作为函数重载的条件吗??? 不可以
//int func(int a, double b)
//{
// cout << "有参数的func(int a ,double b)" << endl;
// return 1;
//}
void test01()
{
//func(1.1,3);
func(1, 3.14);
}
//当函数重载 碰到了 默认参数时候,要注意避免二义性问题
void func2(int a,int b = 10)
{
}
void func2(int a)
{
}
void test02()
{
//func2(10);
}
//引用的重载版本
void func3(int &a) //引用必须要引合法的内存空间
{
cout << " int &a" << endl;
}
void func3(const int &a) //const也是可以作为重载的条件 int tmp = 10; const int &a = tmp;
{
cout << "const int &a" << endl;
}
void test03()
{
//int a = 10;
func3(10);
}
int main(){
//test01();
//test03();
system("pause");
return EXIT_SUCCESS;
}
本文深入解析了函数重载的实现原理,介绍了编译器如何通过修改函数名称来区分重载函数,以及函数重载的条件,包括作用域、参数个数、类型和顺序的不同。并通过代码示例展示了在C++中如何正确使用函数重载。
119

被折叠的 条评论
为什么被折叠?



