C/C++ 的当前应用领域
- 通常情况下,C++ 可以看成是 C 的一个超集,在古典时期,可以认为 C++ 就是 C with classes,语法层面来上来看,大多数 C++ 语法还是与 C 基本一致的
- C 语言目前主要用于像操作系统一类偏底层的应用开发,包括像 Windows/Linux 这样的大型商业操作系统,以及嵌入式操作系统、嵌入式设备上的应用。
- 主要优先考虑程序执行效率和生成的可执行文件的体积(C 代码生成的可执行文件体积相对更小)
- C++ 的应用领域目前有三大类,第一类就是我们目前见到的各种桌面应用软件,尤其 Windows 桌面软件,如 QQ、安全类杀毒类软件(如金山的安全卫士,已开源,其代码地址:http://code.ijinshan.com/source/source.html )、各种浏览器等;
- 另外就是一些基础软件和高级语言的运行时环境,如大型数据库软件、Java 虚拟机、C# 的 CLR、Python 编译器和运行时环境等;
- 第三类就是一些业务型应用软件的后台,像游戏的服务器后台,如魔兽世界的服务器(代码地址:https://github.com/azerothcore/azerothcore-wotlk )和一些企业内部的应用系统。笔者曾在某交易所从事后台开发,其交易系统和行情系统就是基于 C++ 开发的。
C++ 与操作系统平台
- C/C++ 整套的语法不具备“功能完备性”,单纯地使用这门语言本身提供的功能无法创建任何有意义的程序,必须借助操作系统的 API 接口函数来达到相应的功能。
- C/C++ 语言本身不具备网络通信功能,必须使用操作系统提供的网络通信函数(如 Socket 系列函数)而对于 Java 来说,其 JDK 自带的 java.net 和 java.io 等包则提供了完整的网络通信功能。
- C/C++ 语言需要直接使用操作系统的接口功能,这就造成了 C/C++ 语言繁、难的地方。在应用层开发,直接使用操作系统接口的函数,往往执行效率高、控制力度大。
- C/C++ 语言的开发核心建立在直接调用操作系统 API 的基础上,优点是执行效率高、发挥空间大;缺点是,需要经过系统深入的学习,学习周期长,编写代码较复杂,容易出错。
Linux C++ 与 Windows C++ 领域之争
- Windows 和 Linux 的哲学理念不一样,Windows 是假设你不会操作,它教你如何操作,而 Linux 是假设你会操作然后进行操作。。根据这个理念,Windows 一般是普通人用的多,而 Linux 是程序员用的多。
- Windows 的代码风格是所谓的匈牙利命名法,而 Linux 是短小精悍的连字符风格。例如同一个表示屏幕尺寸的整型变量,Windows 上可能被命名为 iScreen 或 cxScreen ,而 Linux 可能是 screen;再例如 Windows 上创建线程的函数叫 CreateThread,Linux 下叫 pthread_create。
- 前端(客户端)开发一般有较多的界面逻辑,它们是直接与用户打交道,因而一款客户端软件的好坏很大程度上取决于其界面的易用性和流畅性,开发者只要把这一端的“一亩三分地”给管理好即可;而后端服务,对于普通用户是透明的,开发者的程序必须尽量体现“服务”这个字眼,即更有效地为更多的客户端服务,这就要求兼顾请求响应的正确性、及时性和流畅性。
如何看待 C++ 11/14/17 新标准
- C++ 既支持面向对象设计(OOP),也支持以模板语法为代表的泛型编程(GP)。
- 更多原来需要使用第三库的功能也被陆续添加到 C++ 标准库中。
C++常用知识点
其他的就是一些关键字的用法(override、final、delete),还有就是一些细节如可以像 Java 一样在类成员变量定义处给出初始化值。
- auto 关键字
- for-each 循环
- 右值及移动构造函数 + std::forward + std::move + stl 容器新增的 emplace_back() 方法
- std::thread 库、std::chrono 库
- 智能指针系列(std::shared_ptr/std::unique_ptr/std::weak_ptr),智能指针的实现原理一定要知道,最好是自己实现过
- 线程库 std::thread + 线程同步技术库 std::mutex/std::condition_variable/std::lock_guard 等
- Lamda 表达式(Java 中现在也常常考察 Lamda 表达式的作用)
- std::bind/std::function 库
C++ 语言基础与进阶
基础
这里说的基础不是狭义上的 C++ 语言基础,而是包括 C++ 开发这一生态体系的基础,笔者认为的基础包括:
- C++ 语言本身熟练使用程度。
- 单纯的 C++ 您啥也干不了,您必须结合一个具体的操作系统平台,所以得熟悉某个操作系统平台的 API 函数,比如Linux,以及该操作系统的原理。这里说的操作系统的原理不局限于您在操作系统原理图书上看的知识,而是实实在在与系统 API 关联起来的,如熟练使用各种进程与线程函数、多线程资源同步函数、文件操作函数、系统时间函数、窗口自绘与操作函数(这点针对 Windows)、内存分配与管理函数、PE 或 ELF 文件的编译、链接原理等等。
- 网络通信,网络通信在这里具体一点就是 Socket 编程。这里的 Socket 编程不仅要求熟练使用各种网络 API 函数,还要求理解和灵活运用像三次握手四次挥手等各种基础网络通信协议与原理。关于 Socket 编程实践,《TCP/IP 网络编程》这本书是非常好的入门教材
一款 C++ 软件 = C++ 语法 + 操作系统 API 函数调用