microsoft: Modern C++

1. auto 关键字

2. 智能指针(smart pointers)

To support easy adoption of RAII principles, the C++ Standard Library provides three smart pointer types:

  • std::unique_ptr
  • std::shared_ptr
  • std::weak_ptr

3. std::string & std::string_view

4. 标准库增加的函数

Here are some important examples:

  • for_each , the default traversal algorithm (along with range-based for loops).
  • transform , for not-in-place modification of container elements
  • find_if , the default search algorithm.
  • sort , lower_bound, and the other default sorting and searching algorithms.
auto comp = [](const widget& w1, const widget& w2)
{ return w1.weight() < w2.weight(); }
sort( v.begin(), v.end(), comp );
auto i = lower_bound( v.begin(), v.end(), comp );
int value {5};
auto iter1 = std::find_if(std::begin(numbers), std::end(numbers),[value](int n) { return n > value; });
if(iter1 != std::end(numbers))
std::cout << *iter1 << " was found greater than " << value << ".\n";

如op的一个实现 即将[first1, last1]范围内的每个元素加5,然后依次存储到result中。

int op_increase(int i) {return (i + 5)};

调用std::transform的方式如下:

std::transform(first1, last1, result, op_increase);

5. for 循环的新句式

#include <iostream>
#include <vector> int main(){
std::vector<int> v {1,2,3}; // C-style
for(int i = 0; i < v.size(); ++i){
std::cout << v[i];
} // Modern C++:
for(auto x : v) std::cout << x;
for(auto& x : v) ++x; // 使用引用,方便我们修改容器中的数据
}

6. constexpr 表达式:替换老式的宏定义

#define SIZE 10  // C-style
constexpr int size = 10; // modern C++

7. 类成员的内部初始化

C++11的基本思想是,允许非静态(non-static)数据成员在其声明处(在其所属类内部)进行初始化。这样,在运行时,需要初始值时构造函数可以使用这个初始值(解决了C++0x之前非常蹩脚的一个初始化形式,尤其对 const char* 和 C类型数组)。

class A {
public:
int a = 7;
};

8. 统一风格的初始化

在现代C ++中,可以对任何类型使用括号初始化。当初始化数组,向量或其他容器时,这种形式的初始化特别方便。在以下示例中,v2使用的三个实例初始化S。v3用三个实例初始化,而这三个实例S本身都用花括号初始化。编译器根据的声明类型推断每个元素的类型v3。

#include <vector>

struct S{
std::string name;
float num;
S(std::string s, float f) : name(s), num(f) {}
}; int main(){
// C-style initialization
std::vector<S> v;
S s1("Norah", 2.7);
S s2("Frank", 3.5);
S s3("Jeri", 85.9); v.push_back(s1);
v.push_back(s2);
v.push_back(s3); // Modern C++:
std::vector<S> v2 {s1, s2, s3}; // or...
std::vector<S> v3{ {"Norah", 2.7}, {"Frank", 3.5}, {"Jeri", 85.9} };
}

8.1. C++17: Aggregate(聚合初始化)

在c++中初始化对象的一种方法是聚合初始化,它允许使用花括号从多个值初始化:

struct Data
{
std::string name;
double value;
}; Data x{"test1", 6.778};

在c++ 17中聚合可以有基类,所以对于从其他类/结构派生的结构,允许初始化列表:

struct MoreData : Data
{
bool done;
}; MoreData y{{"test1", 6.778}, false};

9. Lambda expressions

microsoft: C++异常和错误处理的最佳实践

std::vector<int> v {1,2,3,4,5};
int x = 2;
int y = 4;
auto result = find_if(begin(v), end(v), [=](int i) { return i > x && i < y; });

c++ 17还引入了一个新的类型 std::is_aggregate 来测试一个类型是否是一个聚合:

template<typename T>
struct D : std::string, std::complex<T>
{
std::string data;
}; D<float> s{{"hello"}, {4.5,6.7}, "world"}; // OK since C++17
std::cout << std::is_aggregate<decltype(s)>::value; // outputs: 1 (true)

10. 10. Exceptions 异常

#include <stdexcept>
#include <limits>
#include <iostream> using namespace std; void MyFunc(int c){
if (c > numeric_limits<char> ::max())
throw invalid_argument("MyFunc argument too large.");
//...
} int main(){
try{
MyFunc(256); //cause an exception to throw
}catch (invalid_argument& e){
cerr << e.what() << endl;
return -1;
}
//...
return 0;
}

10.1. 10.1. 基本指导原则

强大的错误处理对于任何编程语言都很有挑战性。 尽管异常提供了多个支持良好错误处理的功能,但它们无法为你完成所有工作。 若要实现异常机制的优点,请在设计代码时记住异常。

  • 使用断言来检查绝不应发生的错误。 使用异常来检查可能出现的错误,例如,公共函数参数的输入验证中的错误。 有关详细信息,请参阅 "异常与断言" 一节。
  • 当处理错误的代码可能与通过一个或多个干预函数调用检测到错误的代码分离时,请使用异常。 当处理错误的代码与检测到错误的代码紧密耦合时,考虑是否使用错误代码而不是在性能关键循环中。
  • 对于可能引发或传播异常的每个函数,请提供以下三种异常保证之一:强保障、基本保证或 nothrow(noexcept)保障。 有关详细信息,请参阅如何:设计异常安全性。
  • 按值引发异常,按引用来捕获异常。 不要捕获无法处理的内容。
  • 不要使用异常规范,后者在 C++ 11 中弃用。有关详细信息,请参阅标题为异常规范和 noexcept 的部分。
  • 应用时使用标准库异常类型。从异常类层次结构派生自定义异常类型。
  • 不允许对析构函数或内存释放函数进行转义。

11. 11. std::atomic 原子类型对象

Use the C++ Standard Library std::atomic struct and related types for inter-thread communication mechanisms.

Modern C++的更多相关文章

  1. [Modern OpenGL系列(四)]在OpenGL中使用Shader

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347440 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...

  2. [Modern OpenGL系列(三)]用OpenGL绘制一个三角形

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...

  3. [Modern OpenGL系列(二)]创建OpenGL窗口

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51295663 在博主的上一篇文章中已经介绍了OpenGL开发环境的搭建,本 ...

  4. [Modern OpenGL系列(一)]十步搞定OpenGL开发环境

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51292143 OpenGL官网:https://www.opengl.or ...

  5. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...

  6. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...

  7. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...

  8. modern.IE – Web 开发必备的 IE 浏览器测试工具

    modern.IE 是微软推出的一个开发人员中心,提供免费的工具和资源,旨在使您能够花更少的时间来测试各种版本的 Internet Explorer,并留出更多时间在现代 Web 上构建重要的内容.m ...

  9. JavaScript Patterns 6.1 Classical Versus Modern Inheritance Patterns

    In Java you could do something like: Person adam = new Person(); In JavaScript you would do: var ada ...

  10. 微软modern.IE网站,多版本IE免费测试工具集

    微软今天发布了modern.IE,这是一系列免费的.针对Web 开发者的测试工具和资源集合网站,微软希望以此来帮助开发者更轻松地实现跨 IE 和其他现代浏览器.跨设备的兼容性,其他还有代码检测工具.标 ...

随机推荐

  1. SpringBoot教程——检视阅读

    SpringBoot教程--检视阅读 参考 SpringBoot教程--一点--蓝本--springboot2.1.1 SpringBoot教程--易百--springboo2.0.5.RELEASE ...

  2. mysql运维入门3:MyISAM和InnoDB

    myisam 5.1的默认存储类型 基于传统的ISAM类型,Indexed Sequential Access Method,有索引的顺序访问方法 存储记录文件的标准方法 不是事务安全,不支持外键 表 ...

  3. JAVA ArrayList集合基础

    java集合的使用方法 一,集合ArrayList的定义方式    ArrayLsit<数据类型> 变量名=new ArrayList<数据类型>(); 二,集合的操作和概念  ...

  4. 搭建本地的yum仓库-较简单

    1.创建目录安装软件程序 1.在/root路径下创建123.sh文件,把此文件复制到123.sh里,  sh 123.sh2.首选安装nginx,作为web展示 3.强力清除老版本残留rpm -e n ...

  5. Java 获取IP工具类、Vo类整理记录

    前言 日常开发中,获取ip是常用的功能,本文记录如何在Java中获取本机外网ip.地理位置,访问用户的外网ip.地理位置,以及指定外网ip的地理位置: 代码编写 1.获取访问用户外网ip,我们从访问者 ...

  6. 【JAVA习题七】输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    package erase; import java.util.Scanner; public class 字符串分类 { public static void main(String[] args) ...

  7. Mysql面试的技术名词

    面试的技术名词 面试一般会遇到一些名词,其实可能自己都知道其中的道理,但是因为没了解过,当时心里就一句WC,然后弱弱答一句:不好意思这个我只是听过,具体还没了解过: 回表 覆盖索引 最左前缀匹配 索引 ...

  8. 2020 网鼎杯wp

    2020 网鼎杯WP 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录 AreUSerialz 知识点:反序列化 打开链接直接给出源码 <?php include ...

  9. spring框架中三层架构相关的注解

    做了这么多年的C++,再去学Java,确实发现,语言都是相通的,即使是Java的那么多生态,理解起来也并不费劲 Spring 框架目前还在学习中,处于 Tourist 阶段,目前只求会做,不求原理,等 ...

  10. Win2003远程桌面突然无法连接,有没有解决方法?

    在日常工作中,运维人员除了接触服务器监控工具外,最常用的应该就是远程桌面了吧.iis7远程桌面是一款绿色小巧的服务器管理工具,更加人性化,管理服务器更是不可测量. 可以管理1000台服务器的远程桌面: ...