重新理解C++的必要性是什么?

发表时间: 2021-10-21 17:43

是时候再学习一次C++了

我相信有很多朋友在读大学的时候学习的第一门编程语言就是C/C++了,我也很确定无论是否是计算机行业的伙伴,都或多或少的知道C++是一种编程语言,至少在我身边很多不懂技术的朋友听说过C++的要比听说过Python、Go的要多的多。

我并不是想通过这个问题来说明C++有广泛的群众基础比其他语言好,相反的我是对C++2000年的后10年的发展速度感到可惜。C++语言创立于1985年,已经有将近40年的历史了,在编程语言世界也算是老人了。

可是现在有许多地方相对于新语言来说是比较落后,这其中一个很重要的原因是从C++98标准开始C++标准就没有大幅更新过,这种情况一直持续到2011年。

在这十几年的时间里,出现了很多新的语言,并且很多的已有的语言也在不断的进步,它们的成长不断压缩着C++语言的使用空间,也直接导致了现在很多新的项目的第一选择语言不是C++。

不过有的时候,这个世界的事情就是三十年河东三十年河西,自从2011年C++委员会发布C++11标准以来,C++就像踏上了复兴号列车,在不到十年里发布了C++14、C++17和C++20三个标准,这让C++世界发生了翻天覆地的变化。俗话说的好,自助者天助之,C++标准的更新换代也激活了整个C++世界,新特性的出现激发了程序员的创作灵感,有大量的代码库开始往新标准更新,这也使这些代码库拥有了更强大的功能以及更高的效率。比如llvm库已经迁移到C++14标准,而Qt6也迁移到了C++17标准。Qt6在宣布使用C++17时,说了这样一段话:

“C++在过去几年发生了很大变化。虽然我们必须将 Qt 5.0建立在C++98上,但现在我们可以将C++17用于Qt 6。这意味着C++提供了更多的开箱即用功能,而这些功能在我们使用 Qt 5 时是不可用的。我们对 Qt6 的目标必须是更好地与这些功能集成,同时不失去向后兼容性。”

从这段话中可以看出,Qt的开发团队对引入C++17是满意且富有激情的。

除了这些大名鼎鼎的代码库,我相信还有无数的项目开始往C++新标准开始迁移,也敢说很多项目可能要以C++17为标准开始开发。另外,虽然有很多场景下开发语言的第一选择不是C++了,但是还有很多场景是确实必须使用C++的,比如游戏、设备驱动程序、HPC和嵌入式等等。如果看到这篇文章的朋友现在还在使用C++98进行开发工作,并且不知道新标准都是什么,那么我建议现在时候重新认识一下C++了——现代C++。

新标准下C++是什么样子的

可能有的朋友会认为即使不学习C++的新标准也能够没有障碍的完成工作任务,那么在你的工作项目中出现这样的C++代码可能会有些不知所措了。

  • 遍历容器怎么没有迭代器了?
std::vector<int> v {1,2,3};for(auto& num : v){  std::cout << num;}迭代器去哪儿了?遍历容器的代码不应该是:for(std::vector<int>::iterator it = v.begin();it != v.end(); ++it){  std::cout << *it;}
  • vector到底是怎么初始化的?
std::vector<int> v {5,5};这里的v到底是拥有55的容器,还应该是25的容器?也许是55吧?因为记得vector有个构造函数是:vector( size_type count,          const T& value,          const Allocator& alloc = Allocator());
  • 算法函数为什么没有不用定义谓语?
std::vector<int> v {1,2,3,4,5};int x = 2;int y = 4;auto result = std::find_if(begin(v), end(v), [=](int i) { return i > x && i < y; });这里的[=](int i) { return i > x && i < y; }是什么代码?
  • 类型后面的省略号到底是什么意思?
template<class T>class base {public:  base() {}  base(T t) : t_(t) {}private:  T t_;};template<class... Args>class derived : public base<Args>...{public:  using base<Args>::base...;};
  • 箭头是指针类型调用成员函数么?看起来不是
void foo(const std::string& arg) {}auto bar() -> void(*)(const std::string&){    return foo;}好像是foo的函数指针类型。
  • C++函数可以返回多个值了?
std::tuple<int, int&> f();auto [x, y] = f();是不是所有的函数都可以返回多个值了?有什么条件?除了std::tuple还能返回其他类型么?
  • 这段代码应该发生几次拷贝构造?
class X {public:  X() { std::cout << "X ctor" << std::endl; }  X(const X&x) { std::cout << "X copy ctor" << std::endl; }  ~X() { std::cout << "X dtor" << std::endl; }};X make_x(){  X x1;  return x1;}int main(){  X x2 = make_x();}2次?1次?还是0次?为什么?有没有标准可以解释?
  • ms是什么新后缀?
using namespace std::chrono_literals;auto d = 100ms;看起来是表达毫秒,那么d是什么类型?有没有s后缀、min后缀或者h后缀?

接下来怎么办

上面是从新标准从随意挑出的8个问题,我相信没有学习过新标准朋友很难全都答对。实际上即使学习过部分新标准的特性也不一定能回答出上面的某些问题。我们需要做的是静下心来全面和系统的学习C++新标准带来的语言特性。

如何系统的学习呢?直接翻阅C++标准手册?不行,太慢了,整整一千八百多页,而且目的性太低,新特性和老特性交织在一起很难区分开。我们需要的是一本书或者一门课程,它们必须能够清晰的描述C++11~C++20中新特性的使用方法和原理,尤其需要阐明那些容易出错的细节。

幸运的是,现在异步社区出版了一本叫做《现代C++语言核心特性解析》的书,该书分为42个章节非常详细的描述了从C++11到C++20中大部分的重要特性,对于复杂的特性还会深入到特性实现的原理,帮助读者更好的理解和运用新特性。

现代C++语言核心特性解析

内容简介:

本书是一本C++进阶图书,全书分为42章,深入探讨了从C++11到C++20引入的核心特性。书中不仅通过大量的实例代码讲解特性的概念和语法,还从编译器的角度分析特性的实现原理,书中还穿插了C++标准委员会制定特性标准时的一些小故事,帮助读者知其然也知其所以然。本书适合因为工作需要学习C++新特性的C++从业者,同样也适合对C++新特性非常感兴趣的C++爱好者。而对于C++初学者来说,也有必要在理解C++基础知识后,通过本书来领略C++的另外一道风景。

除此之外,还有一门盛格塾课程《现代C++42讲》,该课程结合语音和ppt提炼了特性中最重要的部分讲解。

盛格塾是格蠹科技旗下的知识分享平台,是以“格物致知”为教育理念的现代私塾。本着为先圣继绝学的思想,盛格塾努力将传统文化中的精华与现代科技密切结合,以传统文化和人文情怀阐释现代科技,用现代科技传播传统文化。

限时优惠

满100减50