C++:函数的重载

函数的重载
  • 是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同命函数的形参列表(参数个数,类型,顺序)有一不同即可,常用来处理实现功能类似数据包类型不同的问题

When two or more different declarations are specified for a single name in the same scope, that name is said to overloaded. By extension, two declarations in the same scope that declare the same name but with different types are called overloaded declarations. Only function declarations can be overloaded; object and type declarations cannot be overloaded.——《ANSI C++ Standard》
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

还记得我在学习C语言时被通用冒泡排序(为了实现各种数据通用,需要留出接口给用户写判断大小和交换函数)所支配的恐惧=_=,但有了C++的函数重载,就可以使用很小的成本达到这个目的;

#include<Windows.h>
#include<iostream>

using namespace std;

int Add(int a,int b){
    return a+b;
}
double Add(double a,double b){
    return a+b;
}
int main(){
   cout<<Add(1,2)<<endl;
   cout<<Add(1.2,3.4)<<endl;
   return 0;
}

看到这里,你可能也会和我一样疑惑:

为什么C语言不允许重载,而C++允许?

这是由于C的命名规则决定它不具备这样的条件;当一个程序从.c到可执行程序时,一共经过以下几个阶段:

运行步骤执行操作生成文件
预处理头文件展开/宏替换/条件编译/注释删除.i
编译语法/词义/语意…检查,生成汇编代码.s
汇编将汇编代码转为机器码(复杂指令集/精简指令集).o
链接所有文件汇聚起来,生成可执行程序a.out

C语言的名字修饰规则非常简单,只是在函数名字前面添加了下划线,如果进行重载,就会无法区分这些名字相同的函数,从而导致链接错误;而C++在编译的过程中,采用Name Mangling机制,将函数,变量的名称重新改编,简单来说,就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为全局唯一名称:
Name Mangling
在不同编译器下c++函数名底层的修饰对应规则也不尽相同:

  1. Windows-Visual C++:
    在这里插入图片描述
  • ?表示命名开始,后面跟函数名+@,再跟类名/命名空间+@,@+调用约定(__cdecl—>YA…)+函数的参数类型及返回值(H—int;M—float;…)+@+Z表示结束
  1. Linux -g++:
int func(int a);--->_Z4funci//函数名字符长度+函数名+参数类型
double Add(double a);--->_Z4Addd
  • 按照上面重载函数的创建定义,我们在C++环境下将永远不会出现底层名称相同的重载函数;
可不可以在C++中的某个函数使用C风格来编译呢?
  • 陈同志,当然可以!在函数前加extern “C”,这就是告诉编译器,将函数按照C语言规则进行编译;
#include<Windows.h>
#include<iostream>

using namespace std;

extern "C" int Add(int a,int b){
    return a+b;
}

int main(){
   cout<<Add(1,2)<<endl;
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值