【带头学C++】----- 八、C++面向对象编程 ---- 8.8 内联函数 inline

news2024/11/27 3:48:06

目录

8.8 内联函数 inline

8.8.1 声明内联函数

8.8.2 宏函数与内联函数的区别

8.8.3 使用内联函数需注意

8.9 函数重载

8.9.1 什么是函数重载

8.9.2 函数重载的条件

8.9.3 函数重载底层原理是如何实现的?


8.8 内联函数 inline

在C++中,inline是一个关键字,用于向编译器提出建议,希望将函数作为内联函数进行编译。并且内联函数必须在定义的时候 ,前面使用关键字inline修饰限定,注意不能在声明的时候使用inline。

8.8.1 声明内联函数

内联函数: 在编译阶段 将内联函数中的函数体 替换函数调用处。可以避免函数调用时的开销

       使用inline关键字修饰函数时,编译器会尽量将函数的定义嵌入到每个调用处,而不是在编译时生成函数的独立副本。这意味着内联函数没有函数调用的开销。通常情况下,内联函数适合用于简短的函数,且频繁调用的地方。

//函数声明的时候 不要使用inline
int my_add(int x,int y);

//内联函数 在定义的时候使用inline
inline int my_add(int x, int y){
    return x+y;
}
void test01(){
    cout<<my_add(100,200)<<endl;
}

8.8.2 宏函数与内联函数的区别

宏函数和内联函数 都会在适当的位置进行展开,避免函数调用开销。

宏函数的参数没有类型,不能保证参数的完整性。

内联函数的参数有类型 能保证参数的完整性

宏函数在预处理阶段展开

内联函数在编译阶段展开

宏函数没有作用域的限制,不能作为命名空间、结构体、类的成员

内联函数有作用域的限制,能作为命名空间、结构体、类的成员

说法二:(和上面差不多解释)

区别:

  1. 展开方式:宏函数在编译预处理阶段进行简单的文本替换,将宏调用直接替换为宏定义的代码。而内联函数是在编译阶段进行函数体的插入,将函数调用处直接替换为函数的代码。换句话说,宏函数只是简单的文本替换,而内联函数则是代码插入。
  2. 类型检查:宏函数在展开时不进行类型检查,而内联函数会进行严格的类型检查。宏函数只是进行简单的文本替换,而不会关注参数的类型,容易导致意外的错误。
  3. 作用域:宏函数没有作用域限制,可以在任何地方使用。而内联函数需要在函数定义之前进行声明,在其作用域内有效。

共同点:

  1. 减少函数调用开销:宏函数和内联函数都可以减少函数调用的开销,提高程序的执行效率。
  2. 代码复用:宏函数和内联函数都可以用于重复使用一些代码块,避免代码的重复书写。

8.8.3 使用内联函数需注意

在内联函数定义的时候加inline修临类中的成员函数 默认都是内联函数 (不加inline 也是内联函数)有时候就算加上inline也不一定是内联函数 (内联函数条件)不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数取地址
有时候不加inline修饰 也有可能是内联函数
是否内联是由编译器决定(与变量存放寄存器一个道理)

增加inline是为了开发人员想要这个函数变成一个内联函数,提供建议给编译器,它接受不接受完全看当时调用过程。

8.9 函数重载

C++函数重载是指在同一个作用域内,可以定义多个函数名相同但参数列表(参数类型、参数个数或参数顺序)不同的函数。能让我们使用的对象的名字更加方便使用,提高重复利用率,不同需求同一名称,不同参数的结果导向也是不一样的,是任何程序设计语言的一个重要特征!

8.9.1 什么是函数重载

函数重载,是c++的多态的特性 (静态多态)函数重载: 用同一个函数名来表示不同的函数功能。

例如:吃饭,吃饭可以是大口吃、小口吃、快吃、慢吃、可以喝、可以咬吞咽嚼烂。这些都叫吃饭,根据外面传进来的食物,使用不同的方法处理这个食物,比如吃东西进来是咀嚼、还是漱口水,处理的方式不一样,骨头你还要啃,就像牙齿有不同的功能一样。

函数重载允许我们使用相同的函数名来表示处理不同类型的数据或参数组合的操作。通过函数重载,我们可以根据不同的参数类型或参数个数来选择相应的函数进行调用。

函数重载的特点:

  1. 函数名称相同,但参数列表不同。
  2. 函数重载不仅可以根据参数类型的不同进行重载,还可以根据参数个数和参数的顺序进行重载。
  3. 返回类型不是重载的条件,相同的函数名称和参数列表但不同的返回类型是不允许的。

8.9.2 函数重载的条件

同一作用域,函数的参数类型不同、个数不同、顺序不同都可以实现重载。(但是返回值类型不能作为重载的条件)

函数重载的示例: 

int add(int a, int b);  // 加法函数,接受两个int类型参数

int add(int a, int b, int c);  // 加法函数,接受三个int类型参数

double add(double a, double b);  // 加法函数,接受两个double类型参数
//第三个函数的返回值是double,此时不是重载

再例如下面这个案例,在同一作用域范围下定义的同名函数,可以定义4个相同名称的函数,但是由于参数类型不一样,顺序不一样,所以不会报错,符合函数重载的条件。

 

 

void printFun(int a){
    cout << "int" << endl;
}
void printFun(char a){
    cout << "char" << endl;
}
void printFun(int a,char b){
    cout << "int, char" << endl;
}
void printFun(char a,int b){
    cout << "char int" << endl;
}
void test02(){
    printFun(1);
    printFun('a');
    printFun(1,'b');
    printFun('a',1);
}

为什么返回值类型不能作为函数重载的条件之一?

  当编译器能从上下文中确定唯一的函数的时,如

int ret =func();

这个当然是没有问题的。然而,我们在编写程序过程中可以忽略他的返回值。那么这个时候,

void func(int x);

int fun(int x);

当我们直接使用fun(10)这个函数的时候,这个时候编译器就不确定调用那个数。所以在c++中禁止使用返回值作为重载的条件.

func(10);

8.9.3 函数重载底层原理是如何实现的?

void test(){};
void test(int x){};
void test(char x){};
void test(int x,char y){};

 实际上就是函数名字   test  +  (  )   里面的内容 来共同决定调用哪个函数。

其底层原理是是通过名称修饰(Name Mangling)和函数签名来实现的。(实际上就是编译器会自动取个别名)

      在编译源代码时,编译器会根据函数的名称、参数列表和返回值类型等信息生成一个唯一的函数签名。函数签名是一个特定的标识符,用于区分不同的函数定义。

     当程序中调用一个函数时,编译器会根据函数名称和实参的类型、顺序和数量,匹配到与之对应的函数签名。通过函数签名可以准确地找到具体要调用的函数定义。

      通过名称修饰和函数签名的机制,函数重载可以实现在同一个作用域中有多个同名函数的情况。编译器能够根据函数签名来确定调用哪个函数定义,从而实现函数重载的效果。

不同编译器有不同的命名方法.........这个只需要了解,不需要深入研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机_RTOS_架构

一. RTOS的概念 // 经典单片机程序 void main() {while (1){喂一口饭();回一个信息();} } ------------------------------------------------------ // RTOS程序 喂饭() {while (1){喂一口饭();} }回信息() {while (1){回一个信息();} }void main() {create_task(喂饭);cr…

leetcode 611. 有效三角形的个数(优质解法)

代码&#xff1a; class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int lengthnums.length;int n0; //三元组的个数//c 代表三角形最长的那条边for (int clength-1;c>2;c--){int left0;int rightc-1;while (left<right){if(nums[left]nums[r…

生成式AI与预测式AI的主要区别与实际应用

近年来&#xff0c;预测式人工智能&#xff08;Predictive AI&#xff09;通过先进的推荐算法、风险评估模型、以及欺诈检测工具&#xff0c;一直在推高着该领域公司的投资回报率。然而&#xff0c;今年初突然杀出的生成式人工智能&#xff08;Generative AI&#xff09;突然成…

数据库其它调优策略

文章目录 1. 优化MySQL服务器2. 优化数据库结构2.1 差分表&#xff1a;冷热数据分离 3. 大表优化3.1 读/写分离3.2 垂直拆分3.3 水平拆分 1. 优化MySQL服务器 电商平台&#xff0c;双十一&#xff0c;CPU使用率达到99%&#xff0c;系统的计算资源已经耗尽&#xff0c;再也无法…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗? 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&…

基于Java SSM框架+Vue实现垃圾分类网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现垃圾分类网站系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

[cocos creator]EditBox,editing-return事件,清空输入框

需求&#xff1a; 监听EditBox&#xff0c;editing-return 回车事件&#xff0c;在输入框内点击回车后&#xff0c;发送内容&#xff0c;并清空输入框 问题&#xff1a; 设置node.getComponent(EditBox).string ; 没有效果 解决办法&#xff1a; //设置string 为空 this.v…

创纪云助力客服系统:通过API和无代码开发实现与电商平台的智能集成

无缝连接电商和客服系统&#xff1a;管家婆的无代码开发解决方案 在电子商务和客户服务日新月异的发展中&#xff0c;企业面临着如何提高效率和客户满意度的挑战。江苏创纪云网络科技有限公司&#xff08;INNOVATION ERA&#xff09;推出了一款无需API开发的解决方案&#xff…

(git)拉取代码时提示连接失败...SSL certificate problem: self signed certificate

(git)拉取代码时提示连接失败…SSL certificate problem: self signed certificate 解决思路&#xff1a;git 忽略https验证 方法 git config --global http.sslVerify false效果&#xff1a; 解决参考&#xff1a;https://blog.csdn.net/JuleRoch/article/details/10994172…

HWAsan机制

目录 概述 原理 使用 验证开启 对比asan 参考链接 概述 hwasan是Hardware Address Sanitizer的简称&#xff0c;它是clang llvm提供的一套内存错误检测系统&#xff0c;可以用来检测C/C代码常见的内存错误 Stack and heap buffer overflow/underflow Global buffer ove…

实在品牌墙又双叒叕扩容,数十家龙头品牌签约实在RPA

近日&#xff0c;“实在智能 华夏行”数智化赋能之旅火爆前行&#xff0c;为孩子王、视客眼镜、心海伽蓝、洁丽雅、诗裴丝、视贝、博纳泉、鑫荣懋、艾莱得、布诗等数十家优秀企业带来超自动化智能解决方案&#xff0c;帮助商家解决重复低效工作&#xff0c;降低运营成本&#x…

Shell脚本编程案例 – 批量创建特殊要求账户

Shell脚本编程案例 – 批量创建特殊要求账户 Shell Scripting Cases – Create a Bunch of accounts with special requests By JacksonML 本文简要介绍批量执行Shell脚本命令的基本思路&#xff0c;以检验shell脚本知识掌握情况。希望对读者有所帮助。 案例要求&#xff1a…

激光切割头组件中喷嘴的作用是什么

喷嘴是一个不可忽视的部件。尽管喷嘴并不起眼&#xff0c;却有着重要的作用&#xff1b;喷嘴一般是与激光切割头同轴的&#xff0c;且形状多样&#xff1a;圆柱形、锥形、缩放型等。 喷嘴的口径尺寸时不相同的&#xff0c;大口径的喷嘴对聚焦来的激光束没有很严苛的要求;而口径…

python开发之个微自动转发朋友圈

简要描述&#xff1a; 转发朋友圈&#xff0c;直接xml数据。(对谁不可见) 请求URL&#xff1a; http://域名地址/forwardSns 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参…

主流之选!Galaxybase荣获工信部赛宝信创解决方案全国三等奖

喜报&#xff01;“创邻图智能方案”再获工信部官方认可&#xff01; 11月23日&#xff0c;由工业和信息化部电子第五研究所和中国通信企业协会联合主办的“第二届中国赛宝信息技术应用创新优秀解决方案征集活动”结果正式公布&#xff0c;创邻科技Galaxybase智能风控解决方案…

TOPK问题的求解

在这片文章详解二叉树-CSDN博客中我们提到&#xff0c;如果要在非常多的数据(内存存不下)中找到最大或最小的前K个数&#xff0c;我们需要先构建一个K个数的小堆或大堆&#xff1b;再跟堆顶数据比较 要找最大的前K个数建小堆&#xff1b;要找最小的前K个数建大堆 1.构造数据 既…

ZooKeeper的分布式锁---客户端命令行测试(实操课程)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09;。 阅读本文之前&#xff0c;请先阅读…

Ajax的使用方法

1,什么是Ajax&#xff1f; Ajax&#xff08;异步Javascript和XML&#xff09;&#xff0c;是指一种创建交互式网页应用的网页开发技术。 2&#xff0c;Ajax的作用 Ajax可以使网页实现异步更新----即在不更新整个页面的情况下实现对某一部分进行更新。 简单来说Ajax就是用于连接…

不测试,不安全 —— 安全测试的重要性!

1、 什么是安全测试 安全测试是一种软件测试&#xff0c;可发现软件应用程序中的漏洞&#xff0c;威胁&#xff0c;风险并防止来自入侵者的恶意攻击。 安全测试的目的是确定软件系统的所有可能漏洞和弱点&#xff0c;这些漏洞和弱点可能导致信息&#xff0c;收入损失&#xff…

中兴小鲜50 ZTE 畅行50 刷机救砖演示机7543n root 虎贲 展锐 T760 解锁BL

系统信息 网络制式 支持中国移动、中国电信、中国联通、中国广电四大运营商5G频段&#xff1b;支持4G/3G/2G 系统平台 MyOS 13.0&#xff08;基于Android 13&#xff09; 硬件信息 处理器 展锐T760&#xff0c;高性能8核5G芯片 存储 6GB RAM128GB ROM 扩展 不支持 电池容…