引言
C++ 算是一个用户群体比较大的语言了,从 C++98 到 C++11 经历了长达十年多之久的积累,
C++14 则是作为对 C++11 的重要补充和优化,所有这些新标准中扩充的特性,
给 C++ 这门语言注入了新的活力。
那些还在坚持使用传统 C++ (本教程把 C++98 及其之前的 C++ 特性均称之为传统 C++)
而未接触过 C++11/14 的 C++ 程序员在见到诸如 Lambda
表达式这类全新特性时,
甚至会流露出『学的不是同一门语言』的惊叹之情。
C++1x (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。
C++1x 不仅仅增强了 C++ 语言自身的可用性,auto
关键字语义的修改使得我们更加有信心来操控极度复杂的模板类型。
同时还对语言运行期进行了大量的强化,Lambda
表达式的出现让 C++ 具有了『匿名函数』的『闭包』特性,
而这一特性几乎在现代的编程语言(诸如 Python/Swift/… )中已经司空见惯,
右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。
C++1x 为自身的标准库增加了非常多的工具和方法,
诸如在语言层面上提供了 std::thread
支持了并发编程,
在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨平台支持;std::regex
提供了完整的正则表达式支持等等。
C++98 已经被实践证明了是一种非常成功的『范型』,
而 C++1x 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的语言。
C 与 C++ 的区别
在程序设计思想上:
- C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,
对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。 - C++首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,
这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。
之所以说C++比C更先进,是因为“设计”这个概念已经被融入到C++之中。
在语法方面上, 下面两张图可以进行比较清晰的对比:
http://en.cppreference.com/w/c/language
http://en.cppreference.com/w/cpp/language
在标准库方面上,C的标准库是C++的子集:
C Library
C++ Containers
C++ Atomics and threading library
C++ Miscellaneous headers
C++ Input/Output Stream Library
C++ new library in furture
注:以上图片来自 C/C++ Reference.
C++ 11/14 中弃用的特性(不再推荐使用)
如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。
不再允许字符串字面值常量赋值给一个
char *
。如果需要用字符串字面值常量赋值和初始化一个char *
,应该使用const char *
或者auto
:1char *str = "hello world!"; // 将出现弃用警告C++ 98 异常说明、
unexcepted_handler
、set_unexpected()
等相关特性被弃用,应该使用noexcept
。123// 下面两个函数声明的异常规格在语义上是相同的,都表示函数不抛出任何异常void old_stytle() throw(); // 不推荐使用void new_style() noexcept; // 新标准关键字关于C++ Expection的概念以及使用,在未明确其概念之前,不推荐使用;可以在设计程序结构时禁止使用expection.
auto_ptr
被弃用,应使用unique_ptr
,这个是属于标准库中对指针功能的增强。register
关键字被弃用。该关键字在那个计算速度低下的年代,用于启用寄存器来增加运行速度。bool
类型的++
操作被弃用。(未曾使用过)C 语言风格的类型转换被弃用,应该使用
static_cast
、reinterpret_cast
、const_cast
来进行类型转换。123int n = 10;double x = (double) n; // 不再推荐使用double y = static_cast<double>(n); // 推荐使用
还有一些其他诸如参数绑定(C++11 提供了 std::bind
和 std::function
)、export
等特性也均被弃用。
前面提到的这些特性如果你从未使用或者听说过,也请不要尝试去了解他们,应该向新标准靠拢,直接学习新特性。
毕竟,技术是向前发展的。