现代C++学习笔记之二入门篇1

现代 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++能够再次兴起,很大程度得益于手机等终端的发展,毕竟终端设备不可能像台式机,不用考虑硬件的去编程

现代C++学习笔记之二入门篇1,布布扣,bubuko.com

时间: 2024-10-26 00:14:47

现代C++学习笔记之二入门篇1的相关文章

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

基于cygwin学习linux 学习笔记之一:入门篇

最近开始学习linux ,不想折腾装过双系统或者虚拟机,就按照了一个cygwin在windows 模拟linux环境. 首先安装一些常用的插件包:make .gcc.g++.awk. sed.vim等等. 首先先修复下cygwin 下vim 方向键和后退键不能使用的问题: 进入vim74文件夹(具体是vim73,74或者未来的更高版本是情况而定): $ cd /usr/share/vim/vim74 对vim 进行设置: $ cp vimrc_example.vim ~/.vimrc 改过后vi

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

疯狂的暑假学习之  汇编入门学习笔记 (二) 参考:<汇编语言> 王爽  第三章 一.寄存器(内存访问) 1.DS和[address] DS 数据段寄存器,用来存放数据段地址 [address] 用来表示数据段的偏移地址 同样跟CS一样,不可以通过 mov ds, 1000 给ds赋值 要通过通用寄存器ax等. 例如: mov ax, 1000 mov ds, ax mov al, [0] 把1000:0的内容存进al mov bx, 1000 mov ds, bx mov [0], al 把

Java超简明入门学习笔记(二)

Java编程思想第4版学习笔记(二) 第三章 操作符 & 第四章 控制执行流程(流程控制语句)   第三章和第四章的内容主要是讲操作符和流程控制语句,Java的大多数操作符和流程控制语句都和C/C++的十分类似,因此把这两章内容汇成一章,挑出Java独特的地方进行学习.         第三章   知识点1:P39,3.2,操作符,优先级 Java操作符和其他语言一样,作用于操作数,产生新值.各个操作符的优先级和结合性类似C/C++. 这里有一些特殊的地方: + 操作符可以用于字符串,把字符串和

从零开始学习jQuery (一) 开天辟地入门篇

原文:从零开始学习jQuery (一) 开天辟地入门篇 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来! 从零开始学习jQuer

Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填以及可见

我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设置字段的change事件 // form on load event function onLoad() { init();   pageAttr.delivery_from.addOnChange(deliveryFromChange); pageAttr.type.addOnChange(typ

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

cocos2dx 3.1从零学习(一)——入门篇(一天学会打飞机)

我们有C++基础,学习引擎总是急于求成,想立马做出一款简单的游戏给朋友玩.但是我们往往看了很多资料却一直不知道如何下手去写,有时候只要能走出第一步我们就会游刃有余,但是眼高手低的我们不是大神,需要有人指引一下.这里我就写一下我是如何入门学习cocos2dx3.1的,给大家参考一下. 如果你想第一天就写出微信打飞机,请耐心去阅读.我也是一个菜鸟,博客难免粗糙和出错,请大家谅解.加油吧! 我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于