我将在一个月后开始学习 C++11,并且想知道,与 C++03 相比,C++11 提供了哪些好处?
3 回答
如果我必须把它归结为两件事,我会说“右值引用和可变参数模板”是 C++11 对 C++03 最深刻的改进。两者都可以让你做本来应该一直都可以做的事情,并为语言增加了巨大的表达能力。最后,由于右值引用,您可以拥有unique_ptr
具有移动语义的适当容器和容器,并且由于两种构造和谐地发挥作用,因此可以直接构造而不是复制构造:
template <typename ...Args>
void construct(void * p, Args &&... args)
{
::new (p) T(std::forward<Args>(args)...);
}
另一个巨大的改进是将内存模型合并到允许对并发执行(多线程)进行标准化描述的语言中。
不过,还有大量较小的添加使语言更具表现力,并允许您做以前根本无法做的事情:
大括号初始化允许您初始化类成员数组和值构造自动对象。
初始化器列表允许您初始化容器。
更好的常量表达式概念。
为类和联合更好地指定内存布局,以及细粒度的“琐碎”概念,以尽可能地进行优化。
lambda 表达式和闭包使算法和函数式编程变得更加容易和可行。
C++11 的目标是改进 C++ 擅长的所有方面。表现力、性能、类型安全以及改进 C++ 不擅长的东西;一致性和易于学习。C++11 还增加了对在 C++98 首次标准化后变得更加重要的计算趋势的支持,例如多线程
为了提高性能,C++11 添加了右值引用,它允许 C++11 代码避免一些昂贵的副本,而无需难以阅读或理解有时在 C++03 中使用的变通办法。并且任何新功能仍然遵循“不为不使用的东西付费”的格言,保持 C++ 的性能能力。
C++11 增加了很多表达能力,包括可变参数模板、通用属性、用户定义的文字和默认的特殊函数。C++11 还使表达某些可以用 C++03 完成但不太容易的事情变得更加容易,例如静态断言、编译时表达式和模板类型别名,以及删除的特殊函数。
为了类型安全,现在有强类型枚举、显式转换运算符、不会进行丢失精度转换的初始化语法、nullptr 关键字。
C++11 移除了许多限制,使其更加一致且更易于学习。一些例子是非静态数据成员的类内初始化、继承/委托构造函数、初始化列表、右尖括号修复、函数模板的默认模板参数、枚举前向声明、无限制联合等。还有许多新功能可以每个“替换”几个旧功能,这意味着新程序员需要学习更少才能开始。
最初该问题还要求与 C 进行比较。
关于 C++ 和 C,C++11 带来了许多改进,这些改进反映了自 C++ 标准 (C++98) 基于 C99 之前的 C 以来添加到 C 中的功能。例如,C++11 添加了 C99 的可变参数宏long long
,对扩展整数类型和__func__
预定义标识符的要求。C++11 现在要求复数的布局,使其与 C99 中 _Complex 数字的(假定的)布局兼容。可以使用其他特性来代替添加到 C 中的特性,例如 C++11 的统一初始化语法代替 C99 的复合字面量。
C 和 C++ 是完全不同的语言,所以回答这部分问题没有意义。
至于 C++ 到 C++11,您只是在语言中添加了更多现代功能,以帮助您编写更好的面向对象代码。
随着时间的推移,在 BOOST 和其他允许您使用的地方开发了库:
- 智能指针
- 正则表达式
- Lambda 表达式
- 自动变量
- 等等
因此,在大多数情况下,您拥有更多支持您的编码的库,因此您可以使用更多“标准”代码并编写更少的用户代码。这意味着您可以减少调试并更快地编码。
补充说明:这些特性中有很多都是为了促进良好的编程实践。例如,智能指针可帮助您使用 RAII(资源分配即初始化)来确保您动态获取的资源在不再被引用时被释放。
使用 C++11 就像在您已经拥有一辆法拉利时获得了一辆新法拉利。旧的很好并且可以完成工作,但是新的更好并且具有甜蜜的新功能,可以让您更安全,更快地驾驶相同的课程,同时享受更多乐趣:)