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多线程-内存模型

最后推荐一些资料:

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一名软件开发工程师,应该掌握充分的知识和技能来成功地完成各种软件开发项目。以下是一些软件开发工程师应该掌握知识和技能: 首先,软件开发工程师应该具备扎实的编程基础。他们需要熟悉至少一种编程语言,如Java、C++、Python等。他们应该能够理解和编写高质量、可维护的代码,并遵循最佳的编程实践。 其次,软件开发工程师应该了解软件开发的基本原理和概念。他们应该熟悉软件开发生命周期,包括需求分析、设计、编码、测试和维护。他们应该了解软件开发过程中常用的方法论和技术,如敏捷开发、测试驱动开发等。 此外,软件开发工程师应该熟悉数据库管理系统。他们应该了解常用的关系型数据库和非关系型数据库,并知道如何使用SQL语言进行数据库操作和查询。 另外,软件开发工程师应该了解常用的开发工具和平台,如集成开发环境(IDE)、版本控制系统(如Git)、项目管理工具等。他们应该能够熟练地使用这些工具来提高开发效率和代码质量。 最后,软件开发工程师应该具备解决问题的能力和良好的沟通能力。他们应该能够理解客户需求并将其转化为可行的软件解决方案。同时,他们还需要能够与团队成员和其他利益相关者进行有效的沟通和协作。 总之,软件开发工程师应该掌握扎实的编程基础、了解软件开发的基本原理和概念、熟悉数据库管理系统、熟练使用开发工具和平台,并具备问题解决能力和良好的沟通能力。这些知识和技能将帮助他们成功地完成各种软件开发项目。 ### 回答2: 作为一名软件开发工程师,掌握知识技能是非常重要的。首先,他们应该具备扎实的编程基础和算法知识,能够熟练运用多种编程语言,如Java、C++、Python等,以及掌握面向对象编程的思想和方法。 其次,软件开发工程师应该熟悉常用的开发框架和工具,如Spring、Hibernate、Maven等,能够高效地进行软件开发和项目管理。他们还应该了解Web开发的相关技术,如HTML、CSS、JavaScript等,能够设计和开发各种类型的网站和应用程序。 此外,软件开发工程师需要具备良好的团队合作和沟通能力,能够与项目组成员、产品经理和用户进行有效的沟通和协作。他们应该有良好的问题解决能力和逻辑思维能力,能够分析和解决软件开发过程中的各种问题。 另外,软件开发工程师还应该具备良好的学习能力和持续学习的意识,在不断变化的技术环境中跟上最新的开发趋势和技术更新。 总结起来,软件开发工程师应该具备扎实的编程基础和算法知识,熟悉各种开发框架和工具,熟悉Web开发技术,具备团队合作和沟通能力,具备问题解决能力和逻辑思维能力,还应有良好的学习能力和持续学习的意识。 ### 回答3: 作为一名软件开发工程师,需要掌握一系列的知识技能才能胜任工作。首先,需要具备扎实的编程技能,熟悉至少一种主流编程语言,如Java、Python或C++掌握良好的编码风格和程序设计原理,能够高效地解决问题,并具备良好的团队协作能力。 其次,应该了解软件开发的基本流程和方法论,如敏捷开发、迭代开发等。掌握软件工程的基本原则,包括需求分析、系统设计、编码、测试和维护等各个阶段的技巧和方法。 另外,需要具备数据库设计和管理的能力,了解常用的数据库管理系统如MySQL、Oracle等,并掌握SQL语言的使用。能够设计高效的数据库结构,进行数据的存储、查询和更新。 同时,还应该具备良好的问题解决能力和调试技巧,能够迅速定位和解决代码中的bug,并进行错误处理和异常处理。了解常见的调试工具和技术,如断点调试、日志记录等,能够有效地进行代码调试和性能优化。 此外,对于前端开发,需要熟悉HTML、CSS和JavaScript等相关技术,能够进行网页设计和开发,实现良好的用户交互和界面效果。 最后,需要不断学习和追求新技术,关注行业的最新动态和趋势,了解人工智能、大数据、云计算等新兴技术,并能够应用到实际项目中。 总之,一名优秀的软件开发工程师需要具备扎实的编程基础、软件开发流程的知识、数据库设计和管理能力、问题解决和调试技巧、前端开发技术以及持续学习和创新的能力。这些知识技能的掌握将使软件开发工程师能够胜任各类软件开发项目的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值