函数重载---CPP

262 阅读2分钟

什么是函数重载

C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形式参数的个数,顺序,类型不同,常常用于实现功能类似,但是数据类型不同的函数。

int funtion(int a, int b, int c)
{
	return a + b + c;
}
int funtion(double a, double b, int c)
{
	return a + b + c;
}
int funtion(int a)
{
	return a;
}

但是下面的却不构成函数重载

nt funtion(int a, int b, int c)
{
	return a + b + c;
}
double function(double a, double b, double c)
{
	return a + b + c;
}

它们的返回值类型不同

为什么C语言不支持函数重载

这是因为,在C语言中,编译器在编译.c文件时,只会给函数进行简单的重命名;具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同;调用者会因为不知道到底调用那个而出错; 而在CPP中虽然函数名字是一样的,但是符号表却是不一样的,符号表的命名规则是返回类型+函数名+参数列表 我们来验证一下

#include<iostream>
using namespace std;

void print(int i)
{
        cout<<"print a integer :"<<i<<endl;
}

void print(string str)
{
        cout<<"print a string :"<<str<<endl;
}

int main()
{
        print(12);
        print("hello world!");
        return 0;
}

在这段代码中先用g++编译,再执行我们执行命令objdump -d a.out >log.txt反汇编并将结果重定向到log.txt文件中,然后分析log.txt文件。

发现函数void print(int i) 编译之后为:(注意它的函数签名变为—— _Z5printi

image.png

发现函数void print(string str) 编译之后为:(注意它的函数签名变为—— _Z5printSs

image.png 函数的名字变了,所以不存在命名冲突了,而且名字起名是有依据的---—_+返回值+函数名+函数参数

如何在c++文件中实验C语言

非常简单 我们在C语言函数前面加上extern"C"就可以了 extern "C" void add(int a, int b) { printf("%d\n", a + b); }