| |
|
开发:
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++升级之路】第一篇:入门基础知识(下) |
目录 7.内联函数?7.1内联函数的概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 上面书写的代码使用了函数的调用,如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。 通过对比汇编代码,我们可以很清晰的发现两段代码实现方式的不同。 ? 7.2内联函数的特性1、空间换时间inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用。
2、仅为建议?inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
正如《C++prime》第五版关于inline的内容所描述的那样: 这时我们很多朋友就会问了:为什么代码长了就不展开了呢? 其实原因就在于 —— 代码膨胀 我们都知道,一个企业级项目的代码量是非常庞大的,假设我们有一个30行代码的函数,在项目中有10000个地方需要使用,两种不同的方法会有什么区别呢?
? 3、声明定义不可分离inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 下面我将一个头文件,两个源文件的内容放在一个代码段中,实际上inline的声明和定义是分离在不同的头文件和源文件中的,我们在编译之后会发现,出现了bug。
为了能更直观的感受错误发生的原因,我们一起来看一下面的图片: ①假设有三个文件分别将声明和定义分离 ② 在预处理阶段,将头文件的内容在另外两个文件中展开,变成了int func1( ) ? ③在编译阶段,我们就可以发现,在Test.cpp中,只剩下函数的声明了,运行只有声明没有定义的函数?当然会使编译器报错。 那我们函数的定义去哪了呢?实际上,我们的定义被留在了其他文件中(这里是留在了Stack.cpp中了)。 那我们应该如何预防此类问题的出现呢?回到我们第3点特性的开头,只需将函数定义声明都放在头文件中即可(防止声明定义分离) ? ? 知识加餐学习了inline的特性之后,我们很容易联想到C语言宏的知识,接下来让我们一起来学习一道面试题的相关知识
? 8.auto关键字(C++11)8.1类型别名思考随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
举个例子
上述代码实际上是一个类型,但是该类型太长了,特别容易写错。 在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 8.2auto简介C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 简而言之:auto在特定条件下,可以根据你所写的代码,自行推导出所修饰变量的类型。 【使用示例】
【错误示例】
【注意】 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 8.3auto使用细则1.auto与指针和引用结合起来使用用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
2.在同一行定义多个变量当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
8.3auto不能推导的场景1.auto不能做函数的参数
2.auto不能直接用来声明数组
3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法 9. 基于范围的for循环(C++11)9.1范围for循环的用法
对于一个
有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因
此C++11中引入了基于范围的for循环。for循环后的括号 由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。
注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。 9.2范围for的使用条件?1.for循环迭代的范围必须是确定的对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 【注意】以下代码就有问题,因为for不确定
2. 迭代的对象要实现++和==的操作。关于迭代器这个问题,未来我们会深入学习,现在我们只需要了解一下就行了。 10.指针空值nullptr(C++11)10.1C++98中的指针空值在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序会出现错误,为了解决这个麻烦,我们可以用nullptr来替代NULL。 在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器 【注意】
总结本篇文章我们主要介绍了内联函数的概念、特性(空间换时间、仅为建议、声明定义不可分离),同时我们还学习了auto关键字它的自动识别作用和它不能使用的特殊情景,还介绍了范围for循环的用法、需要确定范围的使用条件,最后我们还讲了指针空值nullptr的应用。 我是计算机海洋的新进船长Captain-Lin,如果我的文章能对您有帮助的话,麻烦各位观众姥爷们点赞、收藏、关注,你们的每一次举手之劳都将化为船长的前进动力! 最后,衷心祝福每一位在奋斗途中全力以赴的人,都能得偿所愿! ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 11:28:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |