Live2D

《C++自学入门》1.预备知识

C++是在C语言基础之上开发的一种语言,是C语言的超集,‘++’取至C语言中的自加运算符,其意义不言而喻。学习C++是一次探索之旅,C++是一种令人兴奋的语言,在二十世纪九十年代便是最重要的编程语言之一,并在二十一世纪仍然保持强劲的势头。C++既继承了C语言高效,简介,快速和可移植性的传统,又为应对复杂程度不断提高的现代编程任务而设计出了面向对象编程和模板特性所支持的泛型编程。 

1.C++简介

    在过去的几十年,计算机技术以令人惊讶的速度发展着,当前笔记本电脑的计算速度和存储信息的能力超过了二十世纪六十年代的大型机。计算机语言也得到了发展,尽管变化可能不是天翻地覆的,但也是非常重要的。体积更小,功能更强的计算机也引出了更大,更复杂的程序,而这些程序在程序管理和维护方面带来了新的问题。

1.1  C语言由来

    二十世纪七十年代早期,贝尔实验室的Ritchie致力于开发UNIX操作系统,为完成这项工作,Ritchie需要一种能简洁,快速,有效控制硬件的语言。传统上,当时的程序员使用汇编语言来满足这些需求,汇编语言依赖于内部机器语言。但是这是一种直接操作CPU寄存器和内存单元的低级语言,因为汇编语言针对于特定的计算机处理器,要将汇编程序移植到另一台计算机上,必须重新编写程序。这就像宁买了新车,它和旧车控制部位的位置不同,宁就需要重新学习熟练。

    但是UNIX目的是为不同的计算机平台工作而设计,这就需要一种高级语言,高级语言致力于解决对应的问题,而不是直接操作硬件。(这就像宁知道手动车起步只需要踩离合,挂一档一样,而不需要知道离合具体是怎么实现的)。我们需要知道,一种被称为编译器的特殊程序能将高级语言翻译成特定的计算机内部语言,这样各个平台就可以通过使用不同的编译器在各自平台上使用同一个高级语言程序了。于是Ritchie这位牛逼的大佬又开发出了C语言。

1.2  C语言编程思想

    一般来说程序分为数据结构和算法两个部分。数据是程序使用和处理的信息,而算法是程序使用的方法,说明书。C语言在最初面世时也是过程性语言,计算机处理问题按照步骤一步一步来解决。就像菜谱指定了宁做蛋糕时应遵循的一系列步骤一样。

    随着程序发展和规模的扩大,早期语言都会遇到组织方面的问题,例如,程序经常使用分支语句来判断执行什么命令。很多旧式程序执行路径很混乱,几乎不可能通过直接阅读程序来理解它,更别提修改程序。因此一种更有序的编程方法--结构化编程出现了,C语言具有使用这种方法的特性。还有一种新原则是自上而下的设计,在C语言中,其理念时将大型程序分解成小型,便于管理的任务。如果任务仍然过大,直到将程序分解成小型的,易于编写的模块。(比如宁要整理房间,先整理客厅,再打扫卧室,最后清洁厕所。宁就会先从客厅开始,客厅又分为饭桌,茶几,沙发,最后确定先清理饭桌,再是茶几。。。)

1.3  面向对象编程

    虽然结构化编程的理念提高了程序的清晰度,可靠性,并使之便于维护,但它在编写大型程序时,仍面临挑战。为应对这种挑战,OOP提供了一种新思想,与强调算法的过程性编程不同的是,OOP强调的是数据,OOP不是使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。(宁要炒一个番茄炒蛋,强调过程的C语言表现起来就像这样:先洗菜切菜,再打蛋,再开火放油,炒蛋。。。。但是面向对象思路体现起来更像是这种方式:先安排一个人这个类对象,再取出菜类中的番茄对象和蛋类对象,最后赋予人这个对象执行炒菜的具体方法。)

    C++中,类更像是一种规范,它描述了这种新型的数据格式,而对象是根据这种规划所实例化的特定数据结构。类规定了可使哪些数据来表示对象以及可对数据执行哪些操作,这就是一个类包含的属性和方法两个部分例如,假设宁要开发一个五子棋对战游戏,那么五子棋就可以用类来实现,这个类的属性包含颜色,大小,坐标位置等数据,它的方法可以包含移动,改变大小,改变颜色等操作。这样当需要使用五子棋这个类时,就可以定义创建一个具体对象,该对象保存了描述五子棋的所有数据值。类比到现实生活中,人就是一个类,我们抽象一个人通常用身材,颜值,性格等进行描述,再配上一系列人所具有的行为动作,比如走路,吃饭,学习等。。。这样我们就可以抽象出一个人类,但是我们想要让人类具体实现什么命令时,我们就需要实例化一个某个人类对象来执行。

    OOP程序设计方法首先设计类,然后设计一个特定的使用这些类对象的程序,这种从低级组织到高级组织的处理过程叫做自下而上编程

1.4  C++所带来的

    OOP编程并个仅仅是将数据和力法合并为类定义。例如,封装-->OOP还有助于创建可重用的代码,这将减少大量的工作。信息陷藏,权限访问符可以保护数据,使其免遭不适当的访问。多态-->能够为运算符和函数创建多个定义,通过编程的上下文来确定使用哪个定义。继承-->能够使用旧类派生出新类。对于程序的错误,利用异常可以方便的管理。通过模板,可以实现同名函数对于不同数据类型有各自的处理方式。通过名字空间和作用域访问符,可以有效管理函数名,变量名,类名。等。。。。总之,C++的魅力远不及这些,“此中有真意,欲辨已忘言”。

1.5  C++程序运行

    一个C和C++程序要生成可执行文件,要把源代码通过编译器编译成中间文件,一般Windows下是.obj文件,Linux下是.o文件。而GCC编译C和C++程序运行都会经历四个阶段,预处理,编译,汇编和链接。(GCC是GUN针对C/C++程序推出的编译器)预处理将带#号开头的命令进行替换,展开或是插入对应的头文件,假如在Linux写了一个源代码main.c,预处理-->的命令就是:

gcc -E main.c -o main.i  
#gcc -E是执行生成.i文件的命令,main.c是源文件,-o 后面跟着的是目的文件的名称
#换个角度理解,mian.i是经过预处理的文件,要得到main.i文件必须需要main.c这个源文件

    得到.i文件后就可以进行第二个阶段即是编译、优化阶段,经过预处理得到的输出文件中,只有常量,如数字、字符串、变量的定义,以及c语言的关键字,编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码,用.s表示汇编代码。编译-->的命令是:

gcc -S main.i -o main.s
#同样的道理,我们要得到目的.s文件就需要.i源文件

    接下来就是汇编,汇编就是把汇编代码文件生成机器代码,对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成,一般这个代码是二进制格式,如果我们用VIM编辑器去查看会发现完全认不出来,当然了宁认不出不要紧,计算机能看懂就行了。汇编-->的命令是:

gcc -C main.s -o main.o
#.o文件就是目标文件

    由汇编程序生成的目标文件并不能马上执行,其中可能还有许多没有解决的问题。例如,某个源文件可能引用了另一个源文件中定义的某个变量或者函数调用等,在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。链接的主要工作就是上步生成的.obj文件和系统库的.obj文件、库文件链接起来,最终生成了可以在平台运行的可执行文件链接-->对应的命令是:

gcc main.o -o main 
#main就是可执行文件了,在Linux下不指定名称默认为a.out
#需要执行的话需要在终端输入./+可执行文件名称

    上述操作看起来应该十分繁琐,但是一个标准的C语言可执行程序就是这样产生的,值得庆幸的是上面四行代码可以简化成一行:

gcc main.c -o main
#宁甚至可以再次简化:gcc main.c就可以了,
#因为默认缺省参数是a.out
posted @ 2021-11-25 11:48  半壶清酒  阅读(218)  评论(0)    收藏  举报