与C ++ 03相比,C ++ 11带来了哪些好处?

时间:2012-08-06 19:47:29

标签: c++ c++11

我将在一个月内开始学习C ++ 11并且想知道,与C ++ 03相比,C ++ 11提供了哪些好处?

3 个答案:

答案 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和其他允许您使用的地方开发了库:

  • 智能指针
  • 正则表达式
  • Lambda表达式
  • 自动变量

因此,在大多数情况下,您拥有更多支持编码的库,因此您可以使用更多“标准”代码并编写更少的用户代码。这意味着您要进行调试,以便更快地进行编码。

已添加注意:这些功能中的许多都是为了促进良好的编程实践。例如,智能指针可帮助您使用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的复合文字。