一、简史
编程语言的根本目的是让人类可以更容易的使用计算资源,C++并非一种新语言,但被广泛采用,仍在不断改进。比如目前,国际标准组织(ISO)批准的最新 C++标准为20。
C++最初由 Bjarne Stroustroup 于 1979 年在贝尔实验室开发,旨在作为 C 语言的继任者。
但不同于C 语言,C++是一种面向对象的语言,实现了继承、抽象、多态和封装等概念。C++支持类,而类包含成员数据以及操作成员数据的成员方法。
其结果就是,程序员的编程思维变成了考虑需要什么数据以及要用它们来做什么。
且一直以来,绝大部分C++编译器都支持 C 语言,直至目前依旧如此。
C语言是一个非常古老的语言,但它仍旧是当今世界互联网的基石,无论是你的手机、电脑,还是手表、汽车,基本都离不开它。
它的优点在于我们可以使用非常简洁的语句完成功能的表达,让电子器械按照我们所想去工作。
这里的简洁是相比于汇编语言、机器码而言。
C语言简洁的特点在如今更加简洁的高级语言面前已经显得无足轻重,它现在唯一存在的原因是足够接近底层、效率足够高,仅此而已。
它的知识点非常简单,笼统来说主要的其实就只有几个而已:数据类型、变量、指针、函数、结构体。
只要你学会了上面这几个概念,其实就已经学会了C语言的绝大部分内容,其它的概念基本都是在上面这几个概念上进一步扩展来的。
那么有必要学习C语言吗?
我个人认为是相当有必要的,毕竟它是互联网的基石,其它高级语言大都都是在它的基础之上实现而来的。
C语言本身并不难,学会了C语言,以后你学习其它东西都会轻松一些。
但想要达到一通百通的程度,那还得学一学C语言的大哥:C++。
二、C到C++
C++是在C语言的基础之上发展而来的,相较于C,C++最主要的功能特性其实就两个:
- 面向对象
- 泛型编程
C++继承了C的高效、简洁、快速、可移至性的传统,在此基础上通过面向对象的特性带来了全新的编程方法,这种编程方式是为了应对复杂程度不断提高的现代编程任务所设计的。
而C++中的模板特性则提供了另一种全新的编程方法:泛型编程。
这些东西很强大,但同时也导致了我们需要学习更多的东西。
总的来说,C++融合了三种编程方式:C语言代表的过程性编程、面向对象编程(OOP)、泛型编程
三、C++发展
计算机编程语言都要处理两个基本概念:数据、算法。
其中数据是程序使用和处理的信息,而算法是程序使用这些数据的方法。
C语言面世时是过程性语言,这代表着它强调的是编程算法方法,这也是为什么学算法大多都用C、C++语言的原因。
这种语言最典型的特点就是难以组织代码,一旦程序规模扩大,就几乎不能通过阅读程序来理解它。
为了解决这种问题,就出现了结构化编程,它的理念是将大型程序分解成小型、便于管理的程序,直到将其分解为易于编写的模块,这可以方便理解与移植代码,但这同样反应了面向过程编程的思想。
结构化编程虽然提高了程序的清晰度,但在编写大型程序时,仍然不足,所以又出现了面向对象编程(OOP)。
与面向过程不同,OOP强调的是数据,C++中,类是一种规范,它描述了一种新型的数据格式,对象是根据这种规范构造的特定数据结构。
比如类可以描述学生的基本特性(姓名、年龄、学号、性别等),而对象则代表特定的人(小明、10、10010、男)。
OOP编程方法首先第一步是设计:能准确表达程序要处理的东西,也就类的定义,描述了类有哪些属性可用、哪些事情可做。
当然,它最大的优点之一是让我们可以非常方便的重用、修改现有的代码。
最后,就是泛型编程,OOP强调的是编程的数据方面,而泛型编程强调的是独立于特定数据结构。
泛型(generic)指的是创建独立于类型的代码,凌驾于语言本身的类型之上。
比如C++中有很多类型:整数、小数、字符、用户自定义结构等等,如果想要为其排序,就得分别写处理不同类型的排序代码。
而泛型编程可以让我们只写一个泛型(没有特定类型)函数,然后就能直接将其应用于不同的类型,模板就是实现泛型编程的关键。
四、可移植性和标准
一个系统上编译生成的程序是无法直接运行与另外一个系统的,比如windows上的exe
可执行文件,就无法直接将其拿到linux
系统上去运行,这和语言本身无关。
可移植性,指的是能否在不修改代码的情况下,可以直接在不同系统上直接进行编译生成程序。
作为开发者来说,我们当然是希望拥有一个高可移植性的语言,因为这样能让我们写一份代码直接在不同的平台编译运行了。
为了达成这样的目的,就出现了标准委员会,也就是制定C++语法规则的人,然后再将其交由各大系统、编译器厂商,让其实现这一标准。
典型的C++标准是C++98和C++11,后面的数字代表这个标准是在哪一年通过的,98代表1998年,11代表2011年,这是最经典的两个版本。
自从2011年后,C++标准就每隔三年推进一次,这也就有了C++14
、C++17
、C++20
、C++23
等等,目前得到广泛应用的应该是C++11
与C++14
,如今C++17
和C++20
也已经开始在大量的开源项目中被使用了。
不同版本间的差距一般不会特别大,新版本主要是用来增添一些新的语法功能、修复旧有问题的,并且越是新的版本,其语法一般就可以越发的现代化、写起来越简洁舒服。
但这同样意味着你又有很多东西可以学习了。
五、程序创建
一份C++程序想要运行起来其实并不容易,其基本流程如下图:
graph TD
A[源代码]-->B[编译器]
B-->C[目标代码]
C-->D[链接程序]
D-->E[可执行代码]
F[启动代码]-->D
G[库代码]-->D
因为计算机只认识0和1这样的机器码,所以就需要一个翻译的过程,而编译器就充当了这一角色,它可以将我们的源码翻译为机器码。
- 编译:将源代码转换为目标代码。
- 链接:目标代码与其它库的代码进行链接,最终形成可执行文件。
不同系统上的编译器并不相同,其中linux系统上想要编译源码,可能你就需要配置一大堆东西才行,非常的不方便。
但好在windows系统上有强大的集成开发环境,还没有的可以参照文章初识C++中的介绍去安装。
C/C++编译原理,感兴趣的可以参考文章:深入解析C/C++编译过程:预处理、编译、汇编与链接详解