一、前言
最近刚好有空,趁这段时间,复习C++核心语法
,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的底层开发
、音视频开发
、跨平台开发
、算法
等方向的进一步学习埋下伏笔。
为什么要学习C++
1.1 有没有必要学习C++?
- C++可以说是当今很多流行语言(Java、Python等)的老祖宗,学习C++,相当于理解了流行语言的前世今生
- 多尝试几种不同的编程语言,能提供不同的编程思维视角,站在更高的维度去思考代码
- C++是一门在面向过程和面向对象方面都比较完善的语言,能让我们更接近真相(本质)
- C++程序员转什么领域都可以很快上手
- 如果你想做个普通的程序员,学好所熟悉的语言基本够用,如果你的理想还要更大一点,C++是进阶必备
- 修炼内功,掌握本质,提升逼格
- 程序员鄙视链:汇编 -> C -> C++ -> Java、C# -> PHP
1.2 对C++可能存在的疑惑
- C++是不是很难?(高大上?望而却步?)
- 我又不找C++的工作,有必要学习C++么?
- 各种新的编程语言层出不穷,比如Java、C#、Python、Go、Swift等等,现在学习C++的意义何在?
- 从事IT行业到现在,从来没用过C++,究竟哪些地方能用上C++?C++的应用领域在哪?
1.3 C++的应用领域
- 游戏(Cocos2d-X)、图像、多媒体、网络、嵌入式
- 数据库(Oracle、MySQL)、浏览器(Chrome)、搜索引擎(Google)
- 操作系统、驱动程序、编译器(GCC、LLVM)、编程语言(Swift)
- HPC(High Performance Computing,高性能计算)
- iOS开发(Runtime、AsyncDisplayKit)
- Android开发(NDK、fresco【匿名共享内存,Ashmem,Anonymous Shared Memory】)
- Java开发(JNI)
- ......
- 总结
- C++之所以应用范围如此广泛,得益于它的高效性、稳定性、跨平台性
- 虽然C++在很多大型应用中,无法施展拳脚;但在某些领域,如同巨人一般而且是不可或缺的顶梁柱
- 基本只要是用到C++的地方,都是高大上的地方
1.4 永不过时的编程语言
- 编程语言排行
- 历经40年,“永不过时的编程语言”
- C++自身也在不断发展和完善
- isocpp.org/std/status
- C++正在造福人类
1.5 思考一个问题
- 既然C++执行效率这么高,为什么还要出现新的编程语言?所有编程的地方都用C++不就好了么?
每一门语言都有自己的优缺点,都有自己擅长的领域
- 新的编程语言趋向于更加简洁、高效(开发效率)
- 为了适应不同的应用场景,新的编程语言就诞生了
- ✓统计分析:R
- ✓网站开发:HTML、CSS、JavaScript
- ✓访问数据库:SQL
- ✓......
- 创造一门新的编程语言的成本,有时候会比改进一门编程语言的成本更低
1.6 学习C++必须要求有C语言基础
- 如果你对C语言已经淡忘,或者没有学过C语言,建议你先学C语言再学C++,这样会事半功倍。
- 如果你一时半会没有思路如何筛选可靠的C语言学习资料,可以借鉴我的这几篇文章:
二、C++概述
2.1 C++简介
- “C++”中的++来自于C语言中的递增运算符++,该运算符将变量加1。
- C++起初也叫”C withclsss”.通过名称表明,C++是对C的扩展,因此C++是C语言的超集,这意味着任何有效的C程序都是有效的C++程序。
- C++程序可以使用已有的C程序库
- 程序库
库是编程模块的集合,可以在程序中调用它们
库对很多常见的编程问题提供了可靠的解决方法,因此可以节省程序员大量的时间和工作量
- C++语言的特点
- C++语言在C语言的基础上添加了
面向对象编程
和泛型编程
的支持。 - C++继承了C语言
高效
,简洁
,快速
和可移植
的传统 - C++融合了3种不同的编程方式:
- C语言代表的
过程性语言
- C++在C语言基础上添加的类代表的
面向对象
语言 - C++模板支持的
泛型编程
- C语言代表的
- C++语言在C语言的基础上添加了
- C语言和C++语言的关系:
- C++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。
- 两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。
C语言和C++并不是对立的竞争关系:
- 1)C++是C语言的加强,是一种更好的C语言。
- 2)C++是以C语言为基础的,并且完全兼容C语言的特性。
- C语言和C++语言的学习是可以相互促进
- 学好C语言,可以为我们将来进一步地学习C++语言打好基础
- 而C++语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言
2.2 C++起源
- 与C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在20世纪80年代在这里开发了这种语言。
- Stroustrup关心的是让C++更有用,而不是实施特定的编程原理或风格:
- 在确定语言特性方面,真正的编程比纯粹的原理更重要
- Stroustrup之所以在C的基础上创建C++,是因为C语言简洁、适合系统编程、使用广泛且与UNIX操作系统联系紧密
- 用他自己的话来说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的
- 它的主要功能是可以更方便得编写出好程序,让每个程序员更加快乐”。
2.3 可移植性和标准
- 可移植性
- 假设为运行windows 2000的老式奔腾pc编写了一个很好用的C++程序,而管理员决定使用不同操作系统(比如说Mac OS 或 Linux)和处理器的计算机替换它。
- 该程序是否可在新平台运行呢?
- 当然,但是必须使用为新平台设计的C++编译器
重新编译
。
- 当然,但是必须使用为新平台设计的C++编译器
- 但是是否需要修改写好的代码?
- 如果不需要修改代码的情况下,重新编译程序后,程序依然运行良好,该程序是
可移植
的。
- 如果不需要修改代码的情况下,重新编译程序后,程序依然运行良好,该程序是
- 程序是否可移植性有两个问题需要解决。
- 第一,是硬件,针对特定硬件编程的程序是不可移植的。
- 第二,是语言的实现,windows xp C++ 和 Redhat Linux 或 Mac OS X对C++的实现不一定相同。
- 标准|C++发展历史
- 虽然我们希望C++版本与其他版本兼容,但是如果没有一个公开的标准,很难做到。
- 因此,美国国家标准局(AmericanNational Standards Institute,ANSI)在1990年设立一个委员会专门负责制定C++标准(ANSI制定了c语言的标准)。
- 国际标准化组织(International Organization forStandardization,ISO)很快通过自己的委员会加入到这个行列,创建了联合组织ANSI/ISO,制定C++标准。
- C++98
- 经过多年的努力,制定出了一个国际标准ISO/IEC14882:1998 ,并于1998年获得了ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和ANSI的批准。这个标准就是我们经常所说的C++98。
- 它不仅描述了已有的C++特性,还对语言进行了扩展,添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL).
- C++2003
- 2003年,发布了C++标准第二版(IOS/IEC 14882:2003),这一版本对第一版修订了一些错误,但并没有改变语言特性,因此C++98表示C++98/C++2003.
- C++11
- C++不断发展。IOS标准委员会于2011年8月批准了新标准ISO/IEC 14882:2011,该标准被称为C++11,与C++98一样C++11也新增了许多特性。
- ANSI的规定
- ISO C++标准还吸收了ANSI C语言标准,C++尽量做到是C的超集。意味着在理想情况下,任何有效的C程序都应该是有效的C++程序。
- ANSI不仅定义了C语言,还定义了一个ANSI C必须实现的标准c库。C++也在使用这个库,另外ANSI/ISO C++标准还提供了一个C++标准类库。
2.4 为什么C++会成功
- C的扩展:在C语言特性的基础上增加OOP等编程范式
- C++最初的目的是将C语言转变为OOP(面向对象程序设计)语言,但是C++后来并没有这么做,而是立足于程序的实际。
- 因为在C语言方面大量投入的程序员使其完全丢掉C语言那种编程的思考方式,转而去接受一种新的语言,新的思维,那么将会导致这些程序员中大部分人在短时间内可能毫无成果,使其生产率降低
- 但是如果让这些C程序员
在已有知识的基础上,再去学习C++语言,理解运用OOP,那么也只是在其已有思维的基础上进行扩展而已,这样可以保持其更好的生产率
- 简而言之,强迫程序员放弃C语言和C语言的思考方式,而去转到OOP上是需要代价的,但是从C语言转到C++所花费的代价就会小很多。所以也可以理解为C++的出现并不是去替代C,而是对C的扩展,所以在C++中既可以使用C++新特性,并且可以使用C的过程式思维来编写程序。
- 面向对象开发的特点
- 对于传统的结构化语言,我们向来没有太多的疑惑,函数调用那么自然而明显,只是从程序的某一个地点调到另一个地点去执行。
- 但是对于面向对象(OO)语言,我们疑惑就会很多。
- 其原因就是C++编译器为我们程序员做了太多隐藏的工作:
- 构造函数
- 析构函数
- 虚函数
- 继承
- 多态
- ....
- 有时候它为我们合成出一些额外的函数,有时候它又偷偷在我们写的函数里,放进更多的操作。
- 有时候也会给我们的对象里放进一些奇妙的东西,使得我们sizeof的时候结果可我们预期不一样。
2.5 开发环境简介
- C++语法阶段
- Mac:Xcode
- Windows:Visual Studio Community
- 项目实战阶段
- Windows:Visual Studio Community
- VS下载地址 visualstudio.microsoft.com
我们这里是复习C++核心语法,不进行C++项目实战,且我使用的是Mac电脑,因此我用的是开发工具是 Xcode,大家可以根据自己的喜好,选择其它开发环境,如Clion等
我个人建议有条件的,尽量用Windows的VS进行学习
三、C++初识
1. 语法须知
- C++的源文件扩展名是:cpp(c plus plus的简称)
- C++程序的入口是main函数(函数即方法,一个意思)
- C++完全兼容C语言的语法,很久以前,C++叫做C with classes
2.简单的C++程序
2.1 hello world
- 示例代码:
#include<iostream> using namespace std; int main(){ cout << "hello world" << endl; return EXIT_SUCCESS; }
- 代码分析:
#include<iostream>
; 预编译指令,引入头文件iostream
.using namespace std
; 使用标准命名空间cout << “hello world”<< endl
; 和printf功能一样,输出字符串”hello wrold”
- 问题1:C++头文件为什么没有.h?
- 在C语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。
- 但是C++得用法改变了,C++头文件没有扩展名。
- 但是有些C语言的头文件被转换为C++的头文件,这些文件被重新命名,丢掉了扩展名.h(使之成为C++风格头文件),并在文件名称前面加上前缀C(表明来自C语言)。例如C++版本的math.h为cmath.
- 由于C使用不同的扩展名来表示不同文件类型,因此用一些特殊的扩展名(如hpp或hxx)表示C++的头文件也是可以的,ANSI/IOS标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。
- 问题2:using namespace std 是什么?
- namespace是指标识符的各种可见范围。
- 命名空间用关键字namespace 来定义。
- 命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。
- 此标识符作为此组群的名字。
- 问题3:cout 、endl 是什么?
- cout是C++中的标准输出流,endl是输出换行并刷新缓冲区。
- 补充说明: cin&&cout
- C++中常使用
cin
、cout
进行控制台的输入、输出 cin
用的右移运算符>>
,cout
用的是左移运算符<<
endl
是换行的意思
- C++中常使用
2.2 面向过程
- 面向过程是一种以过程为中心的编程思想。
- 通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
- 面向过程编程思想的核心:
- 功能分解,自顶向下,逐层细化(
程序=数据结构+算法
)
- 功能分解,自顶向下,逐层细化(
- 面向过程编程语言存在的主要缺点是
不符合人的思维习惯
,而是要用计算机的思维方式去处理问题,而且面向过程编程语言重用性低,维护困难
2.3 面向对象
- 面向对象编程(Object-Oriented Programming)简称 OOP 技术,是开发计算机应用程序的一种新方法、新思想。
- 过去的面向过程编程常常会导致所有的代码都包含在几个模块中,使程序难以阅读和维护。
- 在做一些修改时常常牵一动百,使以后的开发和维护难以为继。
- 而使用OOP 技术,常常要使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。
- 在面向对象中,
算法与数据结构被看做是一个整体,称作对象
,现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:- 对象 = 算法 + 数据结构
程序 = 对象 + 对象 + ……
- 从上面的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。
- 面向对象编程思想的核心:
应对变化,提高复用
。
2.4 面向对象三大特性
- 封装
- 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
- 类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。
- 继承
- 继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力
- 继承的作用:避免公用代码的重复开发,减少代码和数据冗余。
- 多态
- 多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
专题系列文章
1. iOS底层原理前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数
、枚举
、可选项
、结构体
、类
、闭包
、属性
、方法
、swift多态原理
、String
、Array
、Dictionary
、引用计数
、MetaData
等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C语言核心语法
- 01-复习C语言核心知识|综述
- 02-复习C语言核心知识|基本语法、数据类型、变量、常量、存储类、基本语句(判断语句、循环语句、go to语句)和运算
- 03-复习C语言核心知识|函数、作用域规则、数组、枚举、字符与字符串、指针
- 04-复习C语言核心知识|结构体、共用体、位域、输入&输出、文件读写
- 05-复习C语言核心知识|预处理、头文件、强制类型转换、错误处理、递归、内存管理
5. C++核心语法
- 01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
6. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
7. 音视频技术核心知识
- 01-📝音视频技术核心知识|了解音频技术【移动通信技术的发展、声音的本质、深入了解音频】
- 02-📝音视频技术核心知识|搭建开发环境【FFmpeg与Qt、Windows开发环境搭建、Mac开发环境搭建、Qt开发基础】
- 03-📝音视频技术核心知识|Qt开发基础【
.pro
文件的配置、Qt控件基础、信号与槽】 - 04-📝音视频技术核心知识|音频录制【命令行、C++编程】
- 05-📝音视频技术核心知识|音频播放【播放PCM、WAV、PCM转WAV、PCM转WAV、播放WAV】
- 06-📝音视频技术核心知识|音频重采样【音频重采样简介、用命令行进行重采样、通过编程重采样】
- 07-📝音视频技术核心知识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-📝音视频技术核心知识|成像技术【重识图片、详解YUV、视频录制、显示BMP图片、显示YUV图片】
- 09-📝音视频技术核心知识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-📝音视频技术核心知识|RTMP服务器搭建【流媒体、服务器环境】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案