C++必须掌握的知识总结

对C++知识做了个总结,因为网络资源过于零碎。大部分教材和资料又都过于片面,这也是情理之中,毕竟C++单单语法设计就很厚一本书了,STL又是如此,对象模型,新标准等等,都是一本书的知识量。除非都看完,否则很难去把握和理解哪些是实际使用上实用的和必须掌握的。实际上我们只需要花20%的时间掌握其中最重要的80%即可。

本文提到的都是作为一个合格的开发者,都应该熟知的内容。
下面内容大多是介绍和总结,具体用法和概念,网上非常容易搜到,不再赘述。

基本语法

讲C++基础语法和面向对象思想的书有很多,推荐Effective C++
要做到熟练基本语法:

  1. 理解C++特性:包括但不限于语言语义理解、编译器和操作系统也就是运行环境的理解。
  2. 要理解值语义,引用语义,指针。

Template

模板也是一大块内容,基本内容不再细述。
我们只需要掌握函数和类模板的基本用法即可。也就是明白模板的语义、模板特化、SFINAE、Type Traits,做到这些就足够日常使用以及理解大部分标准库的设计实现(move forward等)。复杂的模板元编程(TMP),不推荐深入学习。

本质上讲,模板就是替换,但是不同于宏定义,这种替换更为安全和有具体语义。C++11后对模板尽量扩充完善,支持了变参模板默认参数
对模板的学习推荐看一下:https://github.com/wuye9036/CppTemplateTutorial

STL

STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。
在C++标准中,STL被组织为下面的13个头文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory.h>、<numeric>、<queue>、<set>、<stack>和<utility>

多数语言都会提供基本数据结构供我们使用,比如队列、链表等等。几乎任何初具规模的程序都离不开这些库。C++在STL里用模板的方法提供了这些库,并提供泛型支持。命名空间都是std。
注意STL都是值语义的。

vector、list、map、queue、deque、set、stack

这些基本的数据结构,如果不熟悉可以百度。文章都很多。
注意,STL里都值语义。也就是说,vector里面都存储的数值的拷贝,在大元素时,推荐用指针(或者智能指针)。

iterator

迭代器,这是上述容器设计的概念之一,用于遍历容器,stl里算法也多依赖这个桥梁。比如std::find。

algorithm

std提供了一些算法,我们不需要手动实现。如上述所言,它大多数依赖迭代器。具体的使用可以百度。这里只说明一下使用的场景,用到的时候再查即可:

举几个常用的例子,在笔试和实际中都常会用到,想二分搜索?可以用std::binary_search,想排序?可以用std::sort基本上不需要手动写什么冒泡。
常用的还有比如:

  • for_each 应用函数到范围中的元素
  • count 返回满足指定判别标准的元素数
  • sort 将范围按升序排序
  • find 寻找首个满足特定判别标准的元素

其他可以参考:
https://zh.cppreference.com/w/cpp/algorithm

C++11

现代的C++添加了很多实用特性,在我看来也是十分必要的特性,没有这些特性C++将会特别繁琐和难以控制,有必要学习新的C++标准,否则真的建议用其他语言。强类型和二进制类型的也有可选的,比如rust、golang还有kotlin/native等等,上层的更不用说了。

下面是C++新版本的一些介绍:
C++ 11:增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto 关键字、lambda、新容器、列表初始化、标准线程库等。

C++ 14:对C++11的扩展和改进,比如:lambda表达式支持auto,添加std::make_unique等。

C++ 17:小幅增加特性如static_assert()的文本信息可选,if和switch语句中的初始化器,filesyste库等。

C++ 20:很快就会到来,期待模块化(Modules)和协程(Coroutines)等特性。

目前来看,各大编译器对C++11支持都特别友好,甚至在嵌入式(单片机)领域也早就如此。但是C++14以及更新的标准可能不是很理想,而且C++11提供的功能几乎足够我们使用。所以建议都使用C++11作为库设计的标准。

C++11提供的特性已足够我们使用,下面列举关键的特性,详细的推荐阅读Effective Modern C++

auto 类型推导

nullptr

functional

lambda

initializer_list

enum class

static_assert

constexpr

final、override

default、delete

定义成员初始值

以上特性比较简单,不了解的话务必要学一学,推荐一篇文章:C++11 特性

move、forward

move语义需要花时间去理解,使用上,倒是不难,只需要注意move后的对象不要再去使用即可。具体的可以再百度。
forward和完美转发的概念更是要对模板技术有稍微深入的理解。这个意义也不是很大,可以放一放。
可以参考:https://blog.csdn.net/zwvista/article/details/6848582

shared_ptr、unique_ptr、weak_ptr

内存管理对C/C++是个噩梦,gc(垃圾回收)很多时候并不是个好方案。用了gc,意味着放弃实时性领域,gc带来的暂停和内存峰值等会给系统带来灾难,当然了这只是特殊领域的特殊情况。而且gc对于非内存型的资源(文件等)是无法处理的,这也带来了一些问题。

不用gc,如何实现自动内存管理呢?目前的做法就是RAII。RAII听上去高大上,本质上其实就是根据变量作用域和变量析构这部分行为做文章,C++里的智能指针就是依此为基础实现的内存管理。

当然了,内存管理是个大问题。解决方案有很多。
对于C++语言/库层面,智能指针是个大法宝,推荐使用。

具体用法,推荐一篇文章:
[C++]智能指针unique_ptr,shared_ptr,weak_ptr

多线程

多线程是编程的重点和难点之一,以往C/C++都是使用系统库或者POSIX。自C++11起STL提供了直接支持。
用法参考:
std::thread的用法

说到并发,不得不提内存模型。可以只关注在C++11的实现。
推荐文章:
C++11多线程-内存模型

最后推荐一些资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值