文章目录
- 📑前言
- 🌤️函数重载
- ☁️函数重载的概念
- ☁️函数重载的作用
- ☁️C++支持函数重载的原理
- 🌤️内联函数
- ☁️内联函数的概念
- ☁️内联函数的作用
- ☁️内联函数的特性
- 🌤️全篇总结
📑前言
在上一篇文章中我们了解到了命名空间和缺省函数的存在,以及C++为什么要引入它们。本章将继续C++在C语言上扩展出的语法,以帮助大家快速入门。函数竟然还有内联的形式?函数重载,重载的是什么?本篇文章都将会做讲解。
🌤️函数重载
☁️函数重载的概念
是指在同一个作用域内,可以有多个同名函数,但它们的参数列表必须不同(参数类型、参数个数或参数顺序不同)
☁️函数重载的作用
- 提高代码的可读性和可维护性:通过使用相同的函数名来表示一组相关的功能,可以使代码更加清晰和易于理解。
- 简化函数调用:不同的参数列表可以根据不同的情况选择合适的函数进行调用,避免了编写大量的条件判断语句。
- 提供更多的灵活性:通过函数重载,可以根据需要提供多种不同的函数实现,满足不同的需求。
☁️C++支持函数重载的原理
C++支持函数重载,但是C语言不支持函数重载,这是为什么呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接 。
-
实际项目通常是由多个头文件和多个源文件构成,当前a.cpp中调用了b.cpp中定义的Add函数时,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
-
链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
-
链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
Windows下vs修饰规则过于复杂,Linux下g++修饰规则简单易懂,下面使用g++演示这个修饰后的名字。
C语言编译后:函数名字的修饰没有发生改变。
C++编译后:函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
以上我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。
这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
🌤️内联函数
☁️内联函数的概念
内联函数是一种特殊的函数,它在调用时会被直接展开,而不是通过函数调用的方式进行执行。它通常被用来替代宏,以提高代码的执行效率和可读性。
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用.
☁️内联函数的作用
- 提高代码的执行效率:由于内联函数在调用时会被直接展开,避免了函数调用的开销,可以减少函数调用的时间消耗。
- 提高代码的可读性:内联函数可以将一些简单的代码片段直接嵌入到调用处,使代码更加紧凑和易于理解。
☁️内联函数的特性
- 函数体内的代码比较简单:由于内联函数在调用时会被直接展开,因此函数体内的代码应该比较简单,避免展开后的代码过于庞大。
- 函数体内不能有循环语句和递归调用:由于内联函数在调用时会被直接展开,如果函数体内有循环语句或递归调用,展开后的代码可能会过于庞大,影响代码的执行效率。
- 函数声明和定义必须放在同一个文件中:为了能够在调用处展开函数体,编译器需要在调用处获得函数的定义,因此函数的声明和定义必须放在同一个文件中。
- 内联函数适用于频繁调用、代码量较小的函数:由于内联函数在调用时会被直接展开,因此适用于频繁调用、代码量较小的函数。对于代码量较大的函数,由于展开后的代码可能会过于庞大,可能会导致可执行文件的体积增大,从而反而降低代码的执行效率。
🌤️全篇总结
本章我们知道了函数重载和内联函数的作用和特性使用,他们在以后的使用场景出现的频率是很高的。
☁️ 好了,由于篇幅有限,本章只讲解了两个点,后面还有几个点,后续会再出两篇文章,看完这些,你的c++就算是入门啦!
看到这里了还不给博主留个:
👍 点赞🌟收藏 ⭐️ 关注!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。