在 1998 年首次标准化之前,C++ 自 1979 年起就由 Bjarne Stroustrup 在贝尔实验室开发。它是 C 语言的扩展,因为他想要一门像 C 一样高效而灵活的语言。
1983 年,“带类的 C”(C with Classes)更名为“C++”,并加入了新特性,包括虚函数、函数名与运算符重载、引用、常量、类型安全的自由存储内存分配(new/delete),以及改进的类型检查。
20 世纪 90 年代是 C++ 的黄金时代:它非常流行,许多项目都用它开发,尤其是在面向对象编程革命之后。但 1998 年之后,C++ 停滞了许多年。而且在 2000 到 2010 年间,没有大公司支持这门语言的演进——微软把更多精力放在了自己的 .NET 新技术上。
令人意外的是,2010 年之后,人们开始谈论“C++ 复兴”。我们不得不承认,微软是这场运动的主要推动者;我还记得这段视频,Craig Symonds 和 Mohsen Agsen 在其中讨论了这件事。
2011 年,微软在许多文章中宣告了 C++ 的回归,Herb Sutter 等微软 C++ 专家也做了许多演讲,解释 C++ 为何回归,并主要推荐现代 C++ 的用法。与此同时,C++11 标准获得批准,人们开始把 C++ 当作一门新语言来谈论。
然而,在 2011 年,C++ 已经有 30 多年的历史了。要让开发者相信新的 C++ 简化了许多令人沮丧的方面、并且已经有了一种改善 C++ 代码的现代方式,并不容易。
以内存管理为例——这也许是 C++ 中最受诟病的机制。多年来,对象分配都通过 new 关键字完成,开发者必须记得在代码的某个地方调用 delete。“现代 C++”解决了这个问题,提倡使用共享指针。
但遗憾的是,活跃的 C++ 社区和知名专家们的所有努力仍然不够。这个故事的寓意是:如果您给某人用一门语言或一个工具做某件事的可能性,就不要惊讶于他们真的去做了。
C++ 就遇到了这样的情况:我们仍然可以使用 new 和 delete,而且出于种种原因,我们当然不能移除这种可能性。尽管现代 C++ 多年来一直提倡使用智能指针,但用 new 分配对象的做法还会继续存在很多年。
C++ 的过去深深影响着它的使用方式——即使是在新创建的项目中;许多开发者仍然认为这门语言非常复杂。
C++ 的过去是如何影响这门语言的?
为了找到答案,让我们做个测试:在网页上搜索“C++ object allocation”(C++ 对象分配),看看结果——第一页上几乎所有链接讲的都是 new/delete,甚至 malloc。
另一个有趣的测试是:去任何一所大学的图书馆,找一本 C++ 的书,读一读关于对象分配的章节——它讲的主要还是 new 关键字。
总而言之,如果一个 C++ 新手想学习这门语言,他会发现关于“带类的 C”的资源远比关于现代 C++ 的多。
如何限制 C++ 过去的影响?
没有什么神奇的解决方案。我们可以寄希望于 C++ 编译器通过对弃用做法发出警告来帮助我们,比如那些老旧的字符串操作函数(strcpy、strcat……)。但仅靠这个方案不会有太大影响。现代 C++ 更多的是需要学习和实践的新惯用法。
另一个解决方案是:干脆认为 C++ 改了名字,现在叫“Modern C++(现代 C++)”。尽管这个方案非常简单,效果却非常有趣。不信的话,让我们做和之前一样的网页搜索,但这次搜索“Modern C++”对象分配:第一个链接讲的就是智能指针。
给 C++ 新手开发者的一条建议:就当 C++ 改了名字,今后您在网上搜索时,一律使用“Modern C++”而不是 C++——搜索结果会大不相同,因为只用 C++ 搜索,返回的大多是关于旧式做法的信息。
