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