现代 C++ 强调:
-
基于堆栈的范围,而非堆或静态全局范围。
-
自动类型推理,而非显式类型名称。
-
智能指针而不是原始指针。
-
std::string 和 std::wstring 类型(请参见 <string>),而非原始 char[] 数组。
-
标准模板库 (STL) 容器(例如 vector、list 和 map),而非原始数组或自定义容器。 请参见 <vector>、<list> 和 <map>。
-
STL 算法,而非手动编码的算法。
-
异常,可报告和处理错误条件。
-
使用 STL std::atomic<>(请参见 <atomic>),而非其他线程间通信机制的无锁线程间通信。
-
内联 lambda 函数,而非单独实现的小函数。
-
基于范围的 for 循环,编写以 for ( for-range-declaration : expression ) 形式使用数组、STL 容器和 Windows 运行时集合的更可靠循环。 这是核心语言支持的一部分。有关更多信息,请参见基于范围的 for 语句 (C++)。
传统C++:
1 // circle and shape are user-defined types 2 circle* p = new circle( 42 ); 3 vector<shape*> v = load_shapes(); 4 5 for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) { 6 if( *i && **i == *p ) 7 cout << **i << “ is a match\n”; 8 } 9 10 for( vector<circle*>::iterator i = v.begin(); 11 i != v.end(); ++i ) { 12 delete *i; // not exception safe 13 } 14 15 delete p;
现代C++:
#include <memory> #include <vector> // ... // circle and shape are user-defined types auto p = make_shared<circle>( 42 ); vector<shared_ptr<shape>> v = load_shapes(); for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) { if( s && *s == *p ) cout << *s << " is a match\n"; } );
在现代 C++ 中,不必使用 new/delete 或显式异常处理,因为可以使用智能指针来替代。 使用 auto 类型推导和 lambda 函数时,可以更快地编写代码、加强代码并更好地了解代码。 for_each 比 for 循环更整洁和易于使用,并且不容易发生意外错误。 可以使用样本和最少行数的代码来编写应用。 你可以确保代码异常安全和内存安全,并且没有要处理的分配/解除分配或错误代码。
现代 C++ 整合两种多态性:编译时(通过模板)和运行时(通过继承和虚拟化)。 可以混合使用这两种多态性以增强效果。 STL 模板 shared_ptr 使用内部虚拟方法极为轻松地完成类型抹除。 但是,当模板是更好的选择时,请勿过度使用多态性的虚拟化。 模板可以非常强大。
如果从其他语言(尤其是托管语言,其中大多数类型为引用类型,极少类型为值类型)转换到 C++,请注意 C++ 类在默认情况下是值类型。 但是,你可以将这些 C++ 类指定为引用类型,从而实现多态行为以支持面向对象的编程。 有帮助的观点:值类型与内存和布局控制更相关,而引用类型与支持多态性的基类和虚拟函数更相关。 默认情况下,值类型可以复制,每个值类型都具有一个复制构造函数和一个复制赋值运算符。 指定引用类型时,请将类设为不可复制(禁用复制构造函数和复制赋值运算符),并使用支持多态性的虚拟析构函数。 值类型还与内容有关,复制时,这将提供可单独修改的两个独立值。 但引用类型与标识(即对象类型)有关,因此有时称为多态类型。
C++ 又一次兴起,因为功能再次占据首要位置。 当程序员的工作效率很重要时,Java 和 C# 等语言是很好的选择,但当功能和性能至关重要时,此类语言就暴露出了自身限制。要实现高效率和强大功能,特别是在硬件有限的设备上,现代 C++ 无可匹敌。
PS:个人觉得C++能够再次兴起,很大程度得益于手机等终端的发展,毕竟终端设备不可能像台式机,不用考虑硬件的去编程