C++入门之auto关键字内联函数

news/2024/11/28 2:20:08/

文章目录

  • 前言
  • 一、auto关键字
    • 1.auto简介
    • 2.auto的使用细则
      • (1)auto与指针和引用结合起来使用
      • (2)在同一行定义多个变量
      • (3)auto不能推导的场景
    • 3.基于范围的for循环(C++11)
      • (1)遍历
      • (2)修改
      • (3)使用细则
  • 二、内联函数
    • 1.概念
    • 2.debug下查看方法
    • 3.内联函数特性
    • 4.内联函数面式考点


前言


在这里插入图片描述

延续之前的C++入门,本篇介绍C++的auto关键字的使用方法以及内联函数

一、auto关键字

1.auto简介

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

在这里插入图片描述

int TestAuto()
{return 10;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = TestAuto();cout << typeid(b).name() << endl;//这段代码为类型检查,会输出类型cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}

猜猜以上代码会输出什么?
在这里插入图片描述

2.auto的使用细则

(1)auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;*a = 20;*b = 30;c = 40;return 0;
}

在这里插入图片描述

(2)在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

(3)auto不能推导的场景

auto不能作为函数的参数和声明数组

	void TestAuto(auto a)//会报错{}auto arr[3] = { 1,2,3 };//会报错

为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

3.基于范围的for循环(C++11)

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

(1)遍历

	int a[10]={0,1,2,3,4,5,6,7,8,9};for (auto e : a){cout << e;}

在这里插入图片描述

(2)修改

int main()
{int a[10]={0,1,2,3,4,5,6,7,8,9};for (auto &e : a){++e;cout << e;}return 0;
}

在这里插入图片描述

(3)使用细则

箭头指向的位置可以改,只是因为喜欢使用e(元素)

在这里插入图片描述

类型也可以指明

在这里插入图片描述

二、内联函数

1.概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率,例如下面这段代码

1️⃣未加inline时,我们转到反汇编时看

int add(int a, int b)
{return a + b;
}
int main()
{int a = 1;int b = 2;add(a, b);return 0;
}

在这里插入图片描述
2️⃣加了inline时(注意debug情况下不能查看内联函数,后面我会将怎么查看)


inline int add(int a, int b)
{return a + b;
}
int main()
{int a = 1;int b = 2;add(a, b);return 0;
}

在这里插入图片描述

2.debug下查看方法

在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)
在这里插入图片描述

3.内联函数特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

4.内联函数面式考点

(1)宏的优缺点?
1️⃣优点

增强代码的复用性。
提高性能

2️⃣缺点

不方便调试宏。(因为预编译阶段进行了替换)
导致代码可读性差,可维护性差,容易误用。
没有类型安全的检查 。

(2)C++有哪些技术替代宏?

  1. 常量定义 换用const enum
  2. 短小函数定义 换用内联函数

http://www.ppmy.cn/news/46279.html

相关文章

Git——利用SSH密钥本地仓库上传远程GitHub库

文章目录 1、前言2、详细步骤2.1 创建密钥2.2 进入密钥文件并复制2.3 在GitHub上添加密钥2.4 回到本地仓库文件夹&#xff0c;连接GitHub并上传 3. 结语 1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥&#xff0c;接下来讲解大致的步骤&#xff0c;本文默…

网络安全-kali配置ssh服务+敏感文件泄+dirsearch脚本

网络安全-kali配置ssh服务敏感文件泄dirsearch脚本 seccure shell 就是加密的telnet 远程用的 service ssh start 开启ssh服务metstat -tpan |gerp 22 监听这个端口是否开启 可以看到本地的22端口这个文件是/etc/ssh/sshd_config 输入 set number 找到第57行 把这个前面的#注…

VOC数据格式介绍

我们经常需要使用自己通过标注工具&#xff08;如LabelImg、LabelMe等&#xff09;生成的数据集或者一些开源数据集进行目标检测模型的训练&#xff0c;这些自定义数据集格式多样且不具有一致性&#xff0c;而目标检测的数据格式相比于其他任务又复杂很多&#xff0c;因此&…

ASIC-WORLD Verilog(6)运算符

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

C#程序设计——面向对象编程基础,设计一个Windows应用程序,模拟一个简单的银行账户管理系统。实现创建账户、取款、存款和查询余额的模拟操作。

一、实验目的 1、理解简单程序中的面向对象思想的应用 2、掌握C#的定义类和创建对象的方法 3、理解方法中参数的传递 二、实验内容 1、设计一个Windows应用程序&#xff0c;模拟一个简单的银行账户管理系统。实现创建账户、取款、存款和查询余额的模拟操…

索引失效了?看看这几个常见的原因!

索引是 MySQL 数据库中优化查询性能的重要工具&#xff0c;通过对查询条件和表数据的索引&#xff0c;MySQL可以快速定位数据&#xff0c;提高查询效率。但是&#xff0c;在实际的数据库开发和维护中&#xff0c;我们经常会遇到一些情况&#xff0c;导致索引失效&#xff0c;从…

( “树” 之 DFS) 337. 打家劫舍 III ——【Leetcode每日一题】

337. 打家劫舍 III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。…

gRPC-Go源码解读一 客户端请求链路分析

最近在学习gRPC相关的知识&#xff0c;为啥要学呢&#xff1f;因为一直在用&#xff0c;古人云&#xff0c;“工欲善其事&#xff0c;必先利其器”。为此&#xff0c;花了不少时间阅读gRPC-Go的源码&#xff0c;收货甚多&#xff0c;比如透过服务发现和负载均衡这俩组件来学习复…