C++11
听风ing
这个作者很懒,什么都没留下…
展开
-
1.演进、环境与资源
C++11为2011年提出,业内也称为C++2.0。其新特性包括语言和标准库两个层面。C++标准库的header files不带(.h),例如#include <vector>新式C header files 不带(.h),例如#include <cstdio>旧式C header files(带.h),例如#include <stdio.h>以上新的库都在st...原创 2018-05-28 13:59:50 · 182 阅读 · 1 评论 -
12.右值引用及搬移语义(move)
详解https://www.cnblogs.com/5iedu/p/7698710.htmlC++中,所谓右值有两个含义:1.临时对象就是右值2.右值不可以放在operator=(等号操作符)左边如下中,a+b会生成临时对象,c1+c2也会生成临时对象,故其皆为右值,虽然下面的string和complex中临时对象放左边可以编译通过,但这是一种例外,一般不要这样写。 ...原创 2018-08-26 20:55:39 · 185 阅读 · 0 评论 -
11.lambda
C++11中引入了lambda,lambda指的是定义一个内联(inline)函数,并且这个内联函数可以被用作一个参数或局部变量,这类似于函数对象(function object),由于lambda是一种内联的,因此效率上比函数对象高一些。 以下lambda用法:“{}”中为函数体的实现,“()”中放的是函数参数,“[]”中放的是非静态的外部变量,也就是说在lambda函数体内可以用...原创 2018-07-08 15:19:07 · 188 阅读 · 0 评论 -
10. decltype关键字
decltype关键字可以让编译器找到一个表达式的类型。C++11以前无法通过对象来获得type,必须确实知道对象的类型才可以,以下为使用例子: decltype主要有以下3种应用场景:1.声明返回类型这里是采用auto和->decltype指定了add函数返回类型的方式,即声明了add函数的返回类型2.应用于元编程(metaprogramming,就是在模板中的运用和操作)3...原创 2018-07-08 11:31:31 · 1955 阅读 · 0 评论 -
9.type alias,noexcept,overide,final
type alias 类似于typedef,如图中三种形式分别为函数指针、类型的别名(typedef)、模板别名(alias template)在函数后面加noexcept关键字表明该函数不抛出异常,并且能在括号中加入条件,如下面第二个例子表示,swap不抛出异常的条件是当x.swap(y)不抛出异常。碰到移动构造和析构函数时须使用noexcept,对于STL中,尤其是使用vector时,因为ve...原创 2018-06-06 15:05:42 · 193 阅读 · 0 评论 -
8.Alias Template(模板别名)
下图中通过使用using Vec = std::vector<T,MyAlloc<T>>进行模板别名的定义,从而可以直接使用Vec<int> coll来代替上一句话,这种方法类似于C++中的typedef,但这种C++11的新机制不仅仅是为了通过设置模板别名来少写几个字,且其也无法通过typedef或#define代替,如图中下方所示。为了实现下图中红框中的...原创 2018-06-06 13:10:04 · 2117 阅读 · 3 评论 -
7.=default ,=delete
C++中如果不专门定义,编译器会为每一个类定义三种成员函数,默认的构造函数,默认的拷贝构造函数,默认的赋值构造函数(重载=),侯捷老师称它们为big-three,C++11中增加了移动构造函数和移动赋值构造函数(下图中带Zoo&&的),因此增加两个,变成big-five(其实还有析构函数,编译器也会默认给定一个)。如下图中Empty类,这些默认的函数主要让编译器放置幕后的代码,...原创 2018-05-30 11:11:52 · 715 阅读 · 0 评论 -
6.range-based for statement(for循环的新用法)
C++11中定义了一种for循环用法,可用于容器的遍历,如下图。 对于一个容器,我们这样写(decl : coll),coll为一个容器,编译器就会把容器中的每个元素依次放入到decl这个变量中,从而完成遍历,且配合auto关键字可自动参数类型推导,很是方便。 但这里关键要注意值和引用含义的区别,当下面elem为值含义时,每次执行都要进行一次赋值的操作,即把vec的一个元素赋值...原创 2018-05-29 22:41:53 · 757 阅读 · 1 评论 -
5.explicit关键字
首先,explicit表示显示的、明确的意思,与隐式的意思相反,在C++11之前,存在如下图左的隐式转换,Complex的构造函数带两个参数,但一个已经带了初值,且此处无explicit关键字,因此它实际上就是一个non-explicit, one argument constructor(无exp关键字,仅需一个实参的构造函数),此时在执行如下的c1+5时,首先调用+的操作符重载函数,然...原创 2018-05-29 21:32:54 · 174 阅读 · 0 评论 -
4.Uniform Initialization(一致性初始化),Initializer list(初始化列表)
一致性初始化,顾名思义,说明旧版的C++初始化不一致,新版本则一致。确实,老版C++的初始化可能发生在小括号、大括号或是赋值符号上。因此,C++11引入了一致性初始化,全部都用大括号完成初始化,如图中黄色部分。黄色部分,在变量后面直接用大括号完成初始化。使用大括号实现一致性初始化牵扯出了一个新的概念,即Initializer lists,使用大括号的内容即为一个Initializer lists包...原创 2018-05-28 21:18:50 · 1622 阅读 · 0 评论 -
3.模板表达式的空格、空指针、自动推到的auto类型
1.模板表达式的空格老版C++在模板表达式中要加一个空格,新版的已去除。2.空指针类型使用nullptr而非0或NULL来声明一个指向空的指针,避免和int类型冲突发生错误。即它是一种指针类型,而非整数,避免编译器混淆。3.auto变量类型推导auto关键字使编译器根据表达式返回值自动推导类型,但是不要一直用,如图,一般只在类型名太长或太复杂的时候使用,毕竟作为程序员要时时刻刻知道每一个变量的类型...原创 2018-05-28 17:19:30 · 237 阅读 · 0 评论 -
2.Variadic Templates(数量不定的模板参数)
先看代码:void print(){}template <typename T,typename... Types> //...出现在这表示模板参数包void print(const T& firstArg, const Types&... args) //...函数参数类型包{ cout << firstArg << e...原创 2018-05-28 16:34:19 · 1413 阅读 · 0 评论 -
13.C++11中智能指针shared_ptr,unique_ptr,weak_ptr注意点
1、shared_ptrshared_ptr是一个引用计数智能指针,用于共享对象的所有权。可以从一个裸指针、另一个shared_ptr、一个unique_ptr、或者一个weak_ptr构造。析构函数被调用时引用计数减1;当引用计数减为0时,调用删除器删除对象;默认operator delete。构造函数的第二个参数接受一个删除器,这样就可以定制自己的资源分配回收器了。不要为了...原创 2018-08-28 09:37:06 · 500 阅读 · 0 评论