c++11新特性

1:nullptr和std::nullptr_t

c++允许你使用nullptr取代0或NULL,用来表示一个pointer(指针)指向所谓的 no value(此不同于拥有1个不去定值),这个新特性特别能帮助你在“null pointer”被解释为一个整数值是避免误解。例如:

void f(int);

void f (void*);

f(0);

f(NULL);

f(nullptr);

nullptr是个新的关键字.它被自动转换为各种pointer类型,但不会转换为任何整数类型.他拥有类型std::nullptr_t,定义与<cstddef>,所以你现在甚至可以重载函数令他们接受null poniter。主要,std::nullptr_t被视为一个基础类型。

2:以auto完成类型自动推导

c++11允许你声明一个变量或对象而不需要指明其类型,只需说他是auto。例如:

auto i = 42;

double f();

以auto声明的变量,其类型会根据其初值被自动推导出来,因此一定需要一个初始化操作:

auo i;  //ERROR :can't deduce the type of i

可为它加上额外的限定符,例如:

static auto vat = 0.19;

如果类型很长或者表达式很复杂,auot特别有用,例如:

vector<string> v;

auto pos = v.begin();

auto l = [] (int x) -> boll{.....};

3:一致性初始化与初值列

c++引入了“一致性初始化”概念,意思是面对任何初始化动作,你可以使用相同语法,也就是使用大括号。例如:

int values[] {1,2,3};

std::vector<int> v {2,3,4,5,6,7};

std::vector<std::string> cities{"Bejing","HongKong","JiangXi"};

std::complex<double> c{4.2,4.6};

初值列会强迫造成所谓的value initialization,意思是即使某个local变量属于某种基础类型(那通常会有不明确的初值)也会被初始化为0(或nullptr--如果它是个pointer的话)

int i; // i has undefined value

int j{}; // j is initialized by 0

int* p; // p has undefined value

int* q{}; // qis initialized by nullptr

然而请注意,窄化--也就是精确度降低或造成数值变动--对大括号而言是不可成立的。例如

int x1(5.3); //OK,but OUCH:x1 becomes 5

int x2=5.3; //OK,but OUCH:x2 becomes 5

int x3{5.9} //ERROR:narrowing

int x4 = {5.3} //ERROR:narrowing

char c1{7}; //OK:even though 7 is an int ,this is not narrowing

char c2{99999}; //ERROR:narrowing (if 99999 doesn't fit into a char)

std::vector<int> v1 {1,2,3,4} //OK

std::vector<int> v2 {1,2.3,4,5,7.7} //ERROR:narrowing double to ints

4:Range-Based for循环

c++11引入了一种崭新的for循环,可以逐一迭代某个给定的区间,数组,集合内的每一个元素,其一般性语法如下:

for(decl : coll){

statement

}

其中decl是给定之coll集合中的每个元素的声明,针对这些元素,给定的statement会被执行,例如下面针对传入的初值列中的每个元素:

for(int i:{2,3,4,5,6,7,78}){

std::cout << i << std::endl;

}

5:Move语义和Rvalue Reference

c++11的一个最重要的特性就是,支持move semantic(搬迁语义)。这项特性更进一步进入了c++主要涉及目标内,用以避免非必要拷贝和临时对象

6:关键字noexcept

c++11提供了关键字noexcept,用来指明某个函数无法--或不打算--跑出异常。例如

void foo () noexcept;

7:关键字constexpr

自c++11起,constexpr可以来让表达式核定于编译期,例如:

constexpr int suqare(int x)

{

return x*x;

}


8:lambda表达式

9:decltype

新关键字可以染编译器赵成表达式类型

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值