关于专栏
这个专栏是优质的C++教程专栏
本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C++编译器:Clang
感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^
博主反馈非常及时,如果你在阅读的时候遇到问题,可以直接在评论区提问,博主看到后会在24小时内给你反馈
本篇是C++教程专栏的第1篇,因为第1章少了一些知识点,所以在第1篇前补一篇,即第0篇,建议先看本文,再看第1篇
总体来说,本文为第1篇的补充
C++教程 - How to C++系列专栏第0篇
目录
更新记录
2023年8月7日
发布第一篇文章
前言
C语言是啥?啥是面向对象?泛型编程是什么?编译过程是怎么样的?源代码文件扩展名用什么?
C语言
贝尔实验室在20世纪70年代早期Dennis Ritchie致力于开发Unix操作系统,为了开发Unix,他需要一种语言,能够简洁快速的写出程序,有效控制硬件
那时候,程序员一般通过汇编来满足这种需求,汇编依赖与计算机内部的机器语言,是低级语言,可以直接操作硬件,访问CPU寄存器和内存,不具备可移植性(见《C++教程 - How to C++系列专栏第1篇》),但Unix是在不同的设备上运行开发的,意味着它需要更高级的语言,而不是针对一种硬件,在第一篇也有所介绍,这时候我们通过编译器来将高级语言翻译为机器语言,这样,他开发了C语言
C语言编程原理
一般来说,计算机语言要处理两个概念:数据和算法,数据是程序要处理的信息,算法是程序使用的方法,它是过程性语言,也就是说主要强调的是程序的算法,比如,数据就是文章的想法,算法就是写文章的方法,最终输出一篇文章
很早期的语言都会遇到组织问题,程序经常使用分支结构,根据某种测试的结果来执行这一组组还是这一组指令,几乎不可能通过阅读理解,被称为意大利面条式编程。为了解决这种问题,发明了一种编程方法:结构化编程,程序将分支限制为一小组行为的结构,比如for,while,if else等等。从程序的入口函数开始,从上往下依次执行,上一条语句结束之后,下一条语句才会继续执行,是程序的整体的趋势
另一个为自顶向下原则,在C语言中,它的理念是把大程序拆分成小程序,对复杂问题,设计一些子目标作为过渡,逐步细化。程序设计时,应先考虑总体,后考虑细节,先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。
任何程序都可由顺序、选择、重复三种基本控制结构构造
- 用顺序方式对过程分解,确定各部分的执行顺序
- 用选择方式对过程分解,确定某个部分的执行条件
- 用循环方式对过程分解,确定某个部分进行重复的开始和结束的条件
- 对处理过程仍然模糊的部分反复使用以上分解方法,最终可将所有细节确定下来
C++的面向对象
例子
下面的内容怕你们比较难,先举个例子
问题: 洗衣机里面放有衣服,怎么洗干净?
面向过程的解决方法
- 执行加洗衣粉
- 执行加水
- 执行洗衣服
- 执行清洗
- 执行烘干
面向过程就会把这个问题的过程拆成一个个方法,通过一个个方法的执行来解决问题
面向对象的解决方法
- 创建两个对象"洗衣机"对象和"人"对象
- 对象"洗衣机"加入一些属性和方法"洗衣服方法""清洗方法"、"烘干方法"
- 对象"人"加入属性和方法"加洗衣粉方法"、"加水方法"
- 执行
- 人.加洗衣粉
- 人.加水
- 洗衣机.洗衣服
- 洗衣机.清洗
- 洗衣机.烘干
面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题
封装
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体
在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问
通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分
继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。
它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
通过继承创建的新类称为子类或者派生类,被继承的类称为基类、父类或超类
继承的过程,就是从一般到特殊的过程,要实现继承,可以通过继承和组合来实现
继承概念的实现方式有二类:实现继承与接口继承
- 实现继承是指直接使用父类的属性和方法而无需额外编码的能力
- 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力
多态
多态,就是一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口
这意味着,虽然对不同对象的具体操作不同,但通过一个公共的类,它们可以通过相同的方式予以调用
来自光哥_帅大佬的总结:
用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。所谓盖浇饭,北京叫盖饭,东北叫烩饭,广东叫碟头饭,就是在一碗白米饭上面浇上一份盖菜,你喜欢什么菜,你就浇上什么菜。我觉得这个比喻还是比较贴切的。
蛋炒饭制作的细节,我不太清楚,因为我没当过厨师,也不会做饭,但最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。
蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。
到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。
盖浇饭的好处就是"菜""饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,"饭" 和"菜"的耦合度比较低。蛋炒饭将"蛋""饭"搅和在一起,想换"蛋""饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。
C++的泛型编程
泛型实质上就是不使用具体数据类型,而是使用一种通用类型来进行程序设计的方法,泛泛的描述一下数据,这个方法可以大规模的减少程序代码的编写量
模板函数如下:
其中,T是一个数据类型占位符,也就是说,将来T这个位置是一个真实的、具体的数据类型。
所以,可以把T这种类型占位符也称为一种数据类型,就叫泛型
使用这种类型占位符的编程方式就叫泛型编程
总之,泛型也是一种数据类型,但它是用来代替所有类型的"通用类型"
简单介绍编译过程
如何让一个C++程序运行起来呢?
具体的步骤取决于计算机环境和使用的 C++编译器,但大致如下
- 使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码
- 编译源代码。这意味着运行一个程序,将源代码翻译为主机使用的内部语言一一机器语言。但包含了翻译后的程序的文件就是得序的目标代码
- 将目标代码与其他代码链接起来,例如:C++程序通常使用库,C++库包含的一系列计算机函数的目标代码,这些函数可以执行类似于在屏幕上显示信息或计算平方根等任务。链接指的是把目标代码同使用的函数的目标代码以及一些标准的启动代码组合起来,生成程序的运行阶段版本。包含但含该最终文件被称为可执行代码。
源代码只有第一步你写出来的才叫源代码
源代码扩展名
源代码文件有很多种扩展名,其中Unix C++使用.C(大写的字母c),其实,小写的c同样也可以使用,但标准C会一般使用小写c,会造成混乱,所以某些Unix系统可以使用.cc或.cxx
Dos系统比Unix简单点,不区分大小写,所以Dos使用其他系统区分C和C++程序
C++实现 | 源代码文件扩展名 |
---|---|
Unix | C,cc,cxx.c |
GUN C++ | C,cc,cxx,cpp,c++ |
Microsoft Visual C++ | cpp,cxx,cc |
Freestyle CodeWarrior | cp,cpp,cc,cxx,c++ |
Watcom | cpp |
Borland C++ | cpp |
Digital Mars | cpp,cxx |
[源代码文件扩展名] |
结语
作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
如果你们身边有像你提起过这个领域的,或者希望可以和ta一起进步的,把这篇文章分享给ta吧
3952字,12个父项,5个子项,2个孙子项
快捷翻页
本文参考文章,书籍
参考文章
结构化程序设计方法:自顶向下,逐步求精_基础架构逐步细化与求精的方法_guotiaotiao12138的博客-CSDN博客
C语言结构化程序设计_c语言结构化编程_奇点YZ的博客-CSDN博客
C++泛型和泛型编程(通俗理解+模板程序)_什么是c++泛型编程_黑有用_小白的博客-CSDN博客
面向对象与面向过程的本质的区别_面向过程与面向对象的区别_光哥_帅的博客-CSDN博客
参考书籍