- 0. 说明
- 1. 为什么要学习C++
- 1.1 Unix和C
- 1.2 编译器
- 1.3 C++
- 1.4 C++版本
- 1.5 C++历史遗留问题
- 1.6 C++现状
- 2. C和C++的关系
- 2.1 兼容性问题
- 2.2 编码风格
- 2.3 区别
- 2.4 注意
以下内容均来自慕课网课程:
- 趣味 C++ 入门
- 趣味 C++ 进阶
会在此基础上补充一些相关内容和个人理解等。
另外,请教了C++大佬之后,贴上几个学习和使用C++很重要的网页:
- cplusplus:有例子,可以网页上运行
- C++ reference:很规范,各种C++版本标准都有,写的比较官方,不容易看懂
- C++ Standard Library reference:微软的C++引用/文档
1. 为什么要学习C++ 1.1 Unix和C
- 前两个都是标准的C++(针对linux的gcc编译器的)
- 微软的是modern C++(针对windows的mscv编译器的)
- 一般以前者为准,后者会夹带一些自己的私货
1969年,Bell实验室诞生了Unix系统和C语言。
感谢unix和c语言之间有什么关系
1.2 编译器
- 目前的unix的源码,绝大多数都是由C语言编写。小一部分为汇编语言。
- 二者相互促进。最早的unix是由B语言编写的,但是由于不够高效及功能不够完善,为编写更好的unix系统,为此将B语言再次优化,从而形成C语言。C语言因为unix系统而诞生。即先有unix,再出现C语言,然后C语言实现了更强的unix系统。
- unix与C语言相辅相成,共为一体。unix系统及其演变出的类unix系统,搭配的编译器是对C语言规范支持及执行最佳选择。
另外,感谢你是否好奇,第一个C语言编译器是怎么来的
- C语言具有自举特性,自举的意思是该语言的编译器可以编译出编译该语言的编译器。
- 最初的C语言编译器可能是B语言或者B+汇编语言写成的,但是后来的C编译器就完全是使用C语言写的了
- Unix上的C编译器就是gcc(GNU Compiler Collection)
关于linux和gnu的关系,可以看看Linux内核起源之Linux之父
关于gcc的使用,可以看看查看unix系统的c语言编译器,UNIX中CC编译器
1.3 C++80年代,在C的基础上,发展了C++
下图是C++的发明者
- 一开始,C++还不叫C++,而是C with classes,即带有类的C语言,也就是是面向对象的C语言。
- 到1983年,被正式命名为C++
为了保证C++的标准性问题,C++标准委员会成立。
- 并于1998年发布了C++98,也就是第一个C++国际标准
- 参考Tour
- 已有的C++标准为:
- C++98
- C++ 03(2003年)
- C++ 11(2011年)
- C++ 17
- C++ 20
题外话,本科学习使用的谭浩强老师的C++教材,
- 以第三版为例,书是2015年出版的,
- 所以那时候虽然C++11已经出了,但是这本书使用的还是C++ 03的标准。
- 上图中 2003年ISO又发布了第二版C++标准,即目前使用的C++
- 因此,对于我这个本科17级来说,学的还是C++ 03,结果上班就是C++ 11,17。。瞬间懵逼
- 因为C++诞生比较久,因此要保证兼容旧的代码,又要发展新的特性,就会有些不方便的地方
- 另外,上述4种语言中,只有C++没有 自动垃圾回收机制(Garbage Collection,简称为gc)
- 因此在写C++的时候,不仅要考虑资源的分配,还要考虑资源的回收。
以上原因,使得C++的上手门槛比较高,学习路线也比较陡峭
感觉上,使用范围变窄了。
- C++正逐步退出它不适合的领域,例如:Web服务器,界面开发,移动应用开发。
- 而在适合它的领域,C++越来越牢固
C++的优点:
- 没有gc(垃圾自动回收机制),性能非常高
- 可以直接操作指针,这一特性使得C++在密集运算,视频流媒体,人工智能等对性能要求非常高的场景下,几乎唯一的选择。
很多编译器都是同时支持C语言和C++语言的,甚至支持二者的混编。
- 但是在.c后缀的文件里,只支持C语言的语法,不支持C++的语法
- 在.cpp后缀的文件里,C语言和C++的语法都支持
通常把C语言风格实现的代码称为 C Style,把C++语言风格实现的代码称为C++ Style
一般这个Style会使用谷歌的编码Style,参考:
- Google 开源项目风格指南——中文版
- Objective-C 风格指南
一般认为C和C++最大的区别在于:
- 前者是面向过程的,函数从头写到尾,可复用性比较差
- 后者是面向对象的,最典型的就是支持类,同时有继承多态等机制,可复用性较高
- 但这不代表C只能写面向过程,C++只能写面向对象
- C也可以使用结构体和指针,实现面向对象的功能
- C++里也可以只使用函数,进行面向过程的编程
另一个区别在于,C++提供了功能强大的标准库
- STL(Standard Template Library)
- 可以看一下Standard Template Library(STL,标准模板库)有一个比较基础的了解。或者也可以看看相应的wiki百科——标准模板库
- 感觉就像你有了python的基本语法后,也可以去学习使用set,dict,list等更高级的数据类型(这些已经被纳入python的内置库了)
- STL里提供的一些内容就像python的内置库一样。
- 个人理解,不对请指正。
- 这个标准库里已经帮你实现了 数学库、链表、字符串和线程等功能,在C里,你可能要自己实现这些内容。
- 即C++有更多开箱即用的特征,而C语言要考虑更多的底层和实现细节。
C和C++都没有垃圾自动回收机制,都需要手动释放
- 很容易出现没有释放
- 或者同一片内存释放多次的情况
- 而且这种问题一般出现在运行时,比较难找,很难进行debug



