IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C/C++]函数重载三连问,你会吗? -> 正文阅读

[C++知识库][C/C++]函数重载三连问,你会吗?

1. 什么是函数重载

首先,本文是在讲函数重载,那么函数重载是什么呢?
函数重载是指在相同的作用域中,具有相同的名称形参列表不同的多个函数。***注:与函数返回值无关 ***。

形参列表不同代表:函数的参数个数,参数类型,参数的顺序不同
eg:
我们保证在相同作用域,函数名称相同为func时,参数列表不同表示为以下几种情况:

参数类型不一样:
void func(int val){
}
void func(double val){
}
参数个数不一样
void func(float val){
}
void func(float val,float val1){
}
参数顺序不同
void func(int val,double val1){
}
void func(double val,int val1){
}
返回值不同,会报错
void func(int val,double val1){
}
int func(int val,double val1){
}

在C++中我们可以尝试上面几个函数,放在同一个作用域中,不会出现错误;
而在C文件中,我们只要写了两个函数名称相同的函数,就会报错;
大家可以尝试一下,判断上述结论正确与否。
换而言之,C++支持函数重载,用来处理实现功能类似、数据类型不同的问题。
C语言,不支持函数重载

这也是我们接下来要探讨的问题:

2.为什么C++能够支持函数重载,而C语言不支持函数重载。

简而言之: 函数名的修饰规则不同

我们知道C/C++源文件生成可执行文件的四个过程:
1.预处理:展开头文件/宏替换/去掉注释/条件编译
2.编译:检查语法 ->生成汇编代码
3.汇编 :把汇编代码转化成二进制的机器码 (形成符号表)
4.链接 合成可执行的程序,并对声明 在其他目标文件找到对应的定义
也可以看之前的博客
C语言源代码转变为可执行程序的过程

对于一个C++程序来说,我们在链接阶段会根据函数声明去找到其函数定义,所以对于相同名称的函数,我们在这个阶段需要进行区分;

首先我们介绍两个linux命令
gcc -c test.c -o test.o
g++ -c test.cpp -o. test.o
依据test.c 生成其汇编文件test.o
objdump -S test.o
查看汇编文件test.o的内容

C源文件test.c

#include<stdio.h>
void func(int val){
     printf("%d",val);
}
int main(){
   func(1);
   return 0;
}

其对应的汇编文件:
在这里插入图片描述
我们可以看出源文件中的func函数在汇编文件中就是func
我们在看一下同一个源文件以C++修饰方式产生的汇编文件
在这里插入图片描述

函数修饰规则

其实我们之前所说的函数修饰规则不同,通过上面两幅图,我们就可以明确的感觉到;
而两者详细的修饰规则为:
gcc函数修饰后名字不变.
g++函数修饰后的名字为Z+函数长度+函数名+参数类型首字母

总结

C++中即使拥有同名函数,经过汇编之后,在链接时能够依靠修饰后的函数名称进行区分;
而C语言无法进行区分,故而C++支持函数重载,C语言不支持函数重载

判断是否是函数重载

func(vector& vec)和func(vector& vec)可以构成函数重载吗?

答案:可以

void func(vector<int>& vec){
}
void func(vector<float>& vec){
}

汇编文件:
在这里插入图片描述

func(const int val)和func(int val)可以构成函数重载吗?

答案:不可以

void func(const int val){
}
void func(int val){
}

g++ -c test.c -o test.o
test.c: In function ‘void func(int)’:
test.c:7:6: error: redefinition of ‘void func(int)’
void func(int val){
^
test.c:5:6: error: ‘void func(int)’ previously defined here
void func(const int val){

注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:27:24  更:2021-08-23 16:30:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/4 16:26:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码