C++11的新特性

空指针

nullptr 空指针的字面值常量,它的类型是std::nullptr_t(定义位于cstddef)

自动类型推断

auto关键字,由auto定义的变量必须初始化。

统一初始化和初始化列表

C++11 introduced the concept of uniform initialization, which means that for any initialization, you can use one common syntax. This syntax uses braces, so the following is possible now:

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

std::vectorv { 2, 3, 5, 7, 11, 13, 17 };

std::vectorcities {"Berlin", "New York", "London", "Braunschweig", "Cairo", "Cologne"};

std::complexc{4.0,3.0}; // equivalent to c(4.0,3.0)

使用初始化列表初始化时,不提供初始值时默认值初始化(0或nullptr),其他初始化方式若为提供初始值则值是未定义的。

int i; // i has undefined value

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

int* p; // p has undefined value

int* q{}; // q is 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.0}; // 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, 4, 5 }; // OK

std::vector<int>v2 { 1, 2.3, 4, 5.6 }; // ERROR: narrowing doubles to ints

std::initializer_list<>使得函数支持传入多值(通过初始值列表)

void print (std::initializer_list<int> vals){

           for (auto p=vals.begin(); p!=vals.end(); ++p) { 

                    std::cout << *p << "\n";

                    }

}

print ({12,3,5,7,11,13,17}); // pass a list of values to print()

基于范围的循环表达式

for ( decl : coll ) {

        statement

}

coll必须是支持迭代器的容器,或者是数组,或者是值列表类型

移动语义和右值引用

避免无意义的拷贝和暂存变量。

The programmer, however, has to specify that a move is possible unless a temporary is used.

std::move(),位于<utility> 。std::move(x)本身不会进行移动操作,只是将临时变量转换为一个右值引用(X &&x,使用双&声明,表明右值是可以修改的),表明此临时变量x将不会再使用了,可以将它的内容据为己有(不需要拷贝)。

移动之后不再使用原来的变量,原来的变量有效但是状态未定义。

void foo(X &x);//只接受左值

void foo(const X &x);//接受左值和右值

void foo(X &&x);//接受右值

原始字符串字面值、被编码的字符串字面值

Raw String Literals

此类型的字符串可包含特殊字符,语法R"delim(...)delim",delim是16个基本字符组成的分隔符除了反斜杠,空格,圆括号;

例如:R"(\\n)"对应的普通字符串是"\\\n"

常用来定义正则表达式。

Encoded String Literals

使用编码前缀,定义特殊编码的字符串常量:

u8:utf-8,const char

u:char16_t

U:char32_t

L:wchar_t

关键字noexcept

声明一个函数不能或不准备抛出异常。

void foo() noexcept;

若在foo函数内部没有处理发生的异常,程序会终止,调用std::terminate(),它默认调用std::abort();

关键字constexpr

使得表达式在编译期间判断是否是常量,或者修饰返回值返回一个常量。

constexpr int square (int x){

               return x * x;

}

float a[square(9)]; // OK since C++11: a has 81 elements

模板特性

Variadic Templates

可变模板参数个数,例如处理不同类型的参数

void print (){}

template<typename T, typename... Types>

 void print (const T& firstArg, const Types&... args)

{

           std::cout << firstArg << std::endl; // print first argument

            print(args...); // call print() for remaining arguments

}

Alias Templates (Template Typedef)

template<typename T>

using Vec = std::vector>; // standard vector using own allocator

Vec coll;//即std::vector<int, MyAlloc<int>> coll;

lambda表达式

基本语法:

[ capture list ] { function body } 或

[ capture list ]   ( paramters list )   mutable   throwSpec   -> retType { function body }

mutable、  throwSpec、  -> retType 可选

调用:直接调用、生成lambda变量间接调用

[ ] { std::cout << "hello lambda" << std::endl; } (); 或

auto func = [ ] (const std::string &s){ std::cout << "hello lambda"  <<s << std::endl; };

func("good");

使用尾置返回:

未指明返回值类型时,若只有一个return语句,根据返回值自行推断;若有其他语句则返回void。

捕获规则:全局变量不用捕获即可使用

[ ]:不捕获任何变量

[=]:值捕获本作用域外变量

[&]:引用捕获作用域外变量

[x, &y]:显式值捕获x,引用捕获y

[=, &y]:值捕获除y的所有变量,y为引用捕获

[&, x]:引用捕获除x的所有变量,x为值捕获

值捕获变量在定义lambda时就已经确定,在内部不可更改其值,但使用mutable说明符可以使之改变。

lambda的类型

lambda的类型是匿名函数,每个不同的lambda的类型是不一样的。

#include<functional>

例如表达式

[ ] (int a, int b) -> int {  return a + b; }

的类型是std::function<int(int ,int)>,用作返回值类型,可以返回一个lambda对象

std::function<int(int, int)>returnLambda () {

            return [] (int x, int y) { return x*y; };

}

auto f = returnLambda();

cout <<f(1,2)<<endl;

关键字decltype

编译器推断表达式的类型:用于声明返回值类型,元编程或传递lambda的类型

std::map<std::string, sloat> coll;

decltype(coll)::value_type elem;

新的函数声明语法

template<typename T1, typename T2>

auto add(T1 x, T2 y) -> decltype(x+y);//尾置返回,确定返回类型必须预先知道x,y的类型,但返回类型推断放在函数名前面无效(x,y类型此时未知)

作用域枚举(强枚举,枚举类)

enum class Salutation : char { mr, ms, co, none };

1,不可隐式的转换到int或从int转换

2,使用作用域运算符引用Salutation::mr;

3,可以显式定义类型(:char),否则默认是:int

4,可前向声明枚举类型

新的基本数据类型

char16_t, char32_t, long long, unsigned long long ,std::nullptr_t

其他新特性

Nontype Template Parameters

bitset<32> flags32; // bitset with 32 bits

bitset<50> flags50; // bitset with 50 bits

Default Template Parameters

template<typename T, typename container = vector<T>>

class MyClass;

MyClass<int> x1;//即MyClass<int, vector<int>>

Keyword typename

用来说明其修饰的东西是类型

Member Templates

类的成员函数可以为模板

Nested Class Templates

嵌套类也可以为类模板

显式初始化基本数据类型

使用不带参数的显式构造初始化基本数据类型时,为0初始化(所有值都为0)

int i1; // undefined value

int i2 = int(); // initialized with zero

int i3{}; // initialized with zero (since C++11)

main函数的定义

1,

int main{}

2,

int main (int argc, char* argv[]){}

不一定要return 语句,隐式返回0,表示成功执行;返回非0则表示出错;

不使用return来结束程序可使用exit(), quick_exit(), terminate();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容