01-📝C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】

637 阅读20分钟

一、前言

最近刚好有空,趁这段时间,复习C++核心语法,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的底层开发音视频开发跨平台开发算法等方向的进一步学习埋下伏笔。

为什么要学习C++ image.png

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 永不过时的编程语言

1.5 思考一个问题

  • 既然C++执行效率这么高,为什么还要出现新的编程语言?所有编程的地方都用C++不就好了么?
  • 每一门语言都有自己的优缺点,都有自己擅长的领域
  • 新的编程语言趋向于更加简洁、高效(开发效率)
  • 为了适应不同的应用场景,新的编程语言就诞生了
    • ✓统计分析:R
    • ✓网站开发:HTML、CSS、JavaScript
    • ✓访问数据库:SQL
    • ✓......
  • 创造一门新的编程语言的成本,有时候会比改进一门编程语言的成本更低

1.6 学习C++必须要求有C语言基础

二、C++概述

image.png

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++并不是对立的竞争关系:
      • 1)C++是C语言的加强,是一种更好的C语言。
      • 2)C++是以C语言为基础的,并且完全兼容C语言的特性。
    • C语言和C++语言的学习是可以相互促进
      • 学好C语言,可以为我们将来进一步地学习C++语言打好基础
      • 而C++语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言

2.2 C++起源

  • 与C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在20世纪80年代在这里开发了这种语言。C++之父-本贾尼·斯特劳斯特卢普
  • Stroustrup关心的是让C++更有用,而不是实施特定的编程原理或风格:
    • 在确定语言特性方面,真正的编程比纯粹的原理更重要
    • Stroustrup之所以在C的基础上创建C++,是因为C语言简洁、适合系统编程、使用广泛且与UNIX操作系统联系紧密
    • 用他自己的话来说,“C++主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的
    • 它的主要功能是可以更方便得编写出好程序,让每个程序员更加快乐”。

2.3 可移植性和标准

  • 可移植性
    • 假设为运行windows 2000的老式奔腾pc编写了一个很好用的C++程序,而管理员决定使用不同操作系统(比如说Mac OS 或 Linux)和处理器的计算机替换它。
    • 该程序是否可在新平台运行呢?
      • 当然,但是必须使用为新平台设计的C++编译器重新编译
    • 但是是否需要修改写好的代码?
      • 如果不需要修改代码的情况下,重新编译程序后,程序依然运行良好,该程序是可移植的。
    • 程序是否可移植性有两个问题需要解决。
      • 第一,是硬件,针对特定硬件编程的程序是不可移植的。
      • 第二,是语言的实现,windows xp C++ 和 Redhat Linux 或 Mac OS X对C++的实现不一定相同。
  • 标准|C++发展历史 image.png
    • 虽然我们希望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标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。 image.png
  • 问题2:using namespace std 是什么?
    • namespace是指标识符的各种可见范围。
    • 命名空间用关键字namespace 来定义。
    • 命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。
    • 此标识符作为此组群的名字。
  • 问题3:cout 、endl 是什么?
    • cout是C++中的标准输出流,endl是输出换行并刷新缓冲区。
  • 补充说明: cin&&cout
    • C++中常使用cincout进行控制台的输入、输出
    • cin用的右移运算符>>cout用的是左移运算符<<
    • endl是换行的意思

2.2 面向过程

  • 面向过程是一种以过程为中心的编程思想。
  • 通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
  • 面向过程编程思想的核心:
    • 功能分解,自顶向下,逐层细化(程序=数据结构+算法
  • 面向过程编程语言存在的主要缺点是不符合人的思维习惯,而是要用计算机的思维方式去处理问题,而且面向过程编程语言重用性低,维护困难

2.3 面向对象

  • 面向对象编程(Object-Oriented Programming)简称 OOP 技术,是开发计算机应用程序的一种新方法、新思想。
    • 过去的面向过程编程常常会导致所有的代码都包含在几个模块中,使程序难以阅读和维护。
    • 在做一些修改时常常牵一动百,使以后的开发和维护难以为继。
    • 而使用OOP 技术,常常要使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。
  • 在面向对象中,算法与数据结构被看做是一个整体,称作对象,现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:
    • 对象 = 算法 + 数据结构
    • 程序 = 对象 + 对象 + ……
  • 从上面的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。
  • 面向对象编程思想的核心:应对变化,提高复用

2.4 面向对象三大特性

  • 封装
    • 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
    • 类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。
  • 继承
    • 继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力
    • 继承的作用:避免公用代码的重复开发,减少代码和数据冗余。
  • 多态
    • 多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。

专题系列文章

1. iOS底层原理前知识

2. 基于OC语言探索iOS底层原理

3. 基于Swift语言探索iOS底层原理

关于函数枚举可选项结构体闭包属性方法swift多态原理StringArrayDictionary引用计数MetaData等Swift基本语法和相关的底层原理文章有如下几篇:

4. C语言核心语法

5. C++核心语法

6. Vue全家桶

7. 音视频技术核心知识

其它底层原理专题

1. 底层原理相关专题

2. iOS相关专题

3. webApp相关专题

4. 跨平台开发方案相关专题

5. 阶段性总结:Native、WebApp、跨平台开发三种方案性能比较

6. Android、HarmonyOS页面渲染专题

7. 小程序页面渲染专题