C++ 是世界上最常用的编程语言之一。 编写良好的 C++ 程序是快速、高效的。 该语言比其他语言更加灵活,因为你可以使用它来创建各种应用,包括有趣刺激的游戏、高性能科学软件、设备驱动程序、嵌入式程序和 Windows 客户端应用。 在过去的 20 多年中,C++ 已被用于解决许多这样的以及各种其他问题。 你可能不知道,越来越多的 C++ 程序员已经抛弃过时的 C 样式编程,改为使用先进的 C++。

与C语言保持向后兼容性是C++的原始需求之一。 从那时起,C++ 经历了几次迭代演变,从带有类的 C 语言发展到原始的 C++ 语言规范,然后又发展到后来的许多增强版本。 由于有此继承,C++ 通常称为多范例编程语言。 在 C++ 中,可进行纯程序性 C 样式编程,此类编程涉及原始指针、数组、以 NULL 结尾的字符串、自定义数据结构,以及可实现卓越性能同时也可能产生 Bug 和复杂性的其他功能。 由于 C 样式编程充满此类风险,因此 C++ 的一个目标就是使程序既类型安全,又更易于编写、扩展和维护。 在早期,C++ 接受面向对象的编程等编程范例。 多年来,此语言中已加入功能并结合了经过高度测试的标准数据结构和算法库。 正是这些新增功能使得实现现代 C++ 样式成为可能。

现代 C++ 强调:

  • 基于堆栈的范围,而非堆或静态全局范围(Stack-based scope instead of heap or static global scope)。
  • 自动类型推理,而非显式类型名称(Auto type inference instead of explicit type names)。
  • 智能指针而不是原始指针(Smart pointers instead of raw pointers)。
  • std::stringstd::wstring 类型(请参见<string>),而非原始char[]数组(std::string and std::wstring types instead of raw char[] arrays)。
  • 标准模板库 (STL) 容器(例如 vectorlistmap),而非原始数组或自定义容器(Standard template library (STL) containers like vector, list, and map instead of raw arrays or custom containers) (请参见<vector><list><map>。)。
  • STL 算法,而非手动编码的算法(STL algorithms instead of manually coded ones)。
  • 异常,可报告和处理错误条件(Exceptions, to report and handle error conditions)。
  • 使用 STL std::atomic<>(请参见 <atomic>),而非其他线程间通信机制的无锁线程间通信(Lock-free inter-thread communication using STL std::atomic<> instead of other inter-thread communication mechanisms)。
  • 内联 lambda 函数,而非单独实现的小函数(Inline lambda functions instead of small functions implemented separately)。
  • 基于范围的 for 循环,编写以 for ( for-range-declaration : expression ) 形式使用数组、STL 容器和 Windows 运行时集合的更可靠循环(Range-based for loops to write more robust loops that work with arrays, STL containers, and Windows Runtime collections in the form for ( for-range-declaration : expression ))。这是核心语言支持的一部分。有关详细信息,请参阅基于范围的 for 语句 (C++)for_each语句

C++ 语言本身也有所发展。 比较以下代码片段。 下面显示了过去 C++ 的代码片段:

// circle and shape are user-defined types
circle* p = new circle( 42 );
vector<shape*> v = load_shapes(); for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {
if( *i && **i == *p )
cout << **i << “ is a match\n”;
} for( vector<circle*>::iterator i = v.begin();
i != v.end(); ++i ) {
delete *i; // not exception safe
} 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_eachfor 循环更整洁和易于使用,并且不容易发生意外错误。 可以使用样本和最少行数的代码来编写应用。 你可以确保代码异常安全和内存安全,并且没有要处理的分配/解除分配或错误代码。

现代 C++ 整合两种多态性:编译时(通过模板)和运行时(通过继承和虚拟化)。 可以混合使用这两种多态性以增强效果。 STL 模板 shared_ptr 使用内部虚拟方法极为轻松地完成类型抹除。 但是,当模板是更好的选择时,请勿过度使用多态性的虚拟化。 模板可以非常强大。

如果从其他语言(尤其是托管语言,其中大多数类型为引用类型,极少类型为值类型)转换到 C++,请注意 C++ 类在默认情况下是值类型。 但是,你可以将这些 C++ 类指定为引用类型,从而实现多态行为以支持面向对象的编程。 有帮助的观点:值类型与内存和布局控制更相关,而引用类型与支持多态性的基类和虚拟函数更相关。 默认情况下,值类型可以复制,每个值类型都具有一个复制构造函数和一个复制赋值运算符。 指定引用类型时,请将类设为不可复制(禁用复制构造函数和复制赋值运算符),并使用支持多态性的虚拟析构函数。 值类型还与内容有关,复制时,这将提供可单独修改的两个独立值。 但引用类型与标识(即对象类型)有关,因此有时称为多态类型。

C++ 又一次兴起,因为功能再次占据首要位置。 当程序员的工作效率很重要时,Java 和 C# 等语言是很好的选择,但当功能和性能至关重要时,此类语言就暴露出了自身限制。 要实现高效率和强大功能,特别是在硬件有限的设备上,现代 C++ 无可匹敌。

不仅语言现代,开发工具也很现代。 Visual Studio 可让开发周期的各个部分高效可靠。 开发周期包括应用程序生命周期管理 (ALM) 工具、IntelliSense 等 IDE 增强功能、XAML 等工具友好机制,以及生成、调试和许多其他工具。

随机推荐

  1. freeswitch 注册错误408 - Request Timeout

    1.网络不通(可能虚拟机没打开网络) 2.防火墙没有过滤端口号(关闭防火墙) 3.IP地址错误

  2. SVN提交代码时报405 Method Not Allowed

    原因: 1.删除了某个文件夹,然后又创建了一个同名文件夹 2.之前执行过Add操作,但没上传代码,在电脑上提交了同路径的代码,再次上传时会报错 解决方法: 1. 删除出现错误的文件夹 2. SVN U ...

  3. IDEA使用快捷键

     sout+TAB键---->System.out.println();你可以按ctrl+j里面各种快捷键模板都可以看到. Intellij Idea get/set方法快捷键:Alt+Inse ...

  4. HDU 3949 XOR(高斯消元搞基)

    HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...

  5. nodejs中require的路径是一个文件夹时发生了什么

    node中使用require的时候如果路径是一个文件夹时,或者特殊的情况require('..');require('.'); 这是node实战这本书里说的情况,但是我在node6.9版本中发现不完全 ...

  6. [Android] Android开发优化之——对界面UI的优化(1)

    在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的.界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局.通常,在这个页面中会用到很多 ...

  7. 安卓通过OkHttp获取json数据

    使用Http协议访问网络 OkHttp使用 可以很好的获取接口数据!json数据! 支持get和post提交方式!!! 1.引入模块 compile 'com.squareup.okhttp3:okh ...

  8. ES索引模板——就是在新建索引时候指定的正则匹配来设置mapping而已,对于自动扩容有用

    索引模板 扩容设计 » 索引模板 Elasticsearch 不要求你在使用一个索引前创建它. 对于日志记录类应用,依赖于自动创建索引比手动创建要更加方便. Logstash 使用事件中的时间戳来生成 ...

  9. ES shard unassigned的解决方法汇总

    说下shard出现的几个状态说明: relocating_shards shows the number of shards that are currently moving from one no ...

  10. oracle 11g not in 与not exists 那个高效?

    网络上很多谣言是后面跟小表用not in,后面跟大表用not exists,难道真的是这样子的嘛? 情况下面测试: 1.先用小表测试(1000条记录和一张8万条记录的表): SQL> creat ...