C++11新特性之新类型与初始化

姓名:雷潇 16030110083

转载自:http://www.lai18.com/content/24569586.html

【嵌牛导读】这是C++11新特性介绍的第一部分,比较简单易懂,但是也有一些有趣的地方。

不想看toy code的读者可以直接拉到文章最后看这部分的总结。

【嵌牛鼻子】数据类型的定义,指针

【嵌牛提问】如何选取适当的数据类型才能满足存储的要求?

【嵌牛正文】

新类型

long long类型

C++11标准中新加入了long long类型属性,占用空间不小于long类型。测试代码如下:

[cpp]view plaincopy

longlarge = LONG_MAX;

longlonglong_large = LLONG_MAX;

longlonglong_long_large = 1LL << 63;

cout<<"test long long:"<

在我的机器上实测,long long类型和long类型同样使用64bit空间。

nullptr字面量

C++11标准中专门为空指针增加了nullptr字面量,同时不推荐再使用NULL或者0表示空指针。

[cpp]view plaincopy

int*p1 = nullptr;

int*p2 = 0;

int*p3 = NULL;

cout<<"test nullptr: "<<(p1 == p2)<<'\t'<<(p1 == p3)<

最终测试结果,nullptr和NULL和0是一样的。

constexpr

C++11标准中新增constexpr用于声明常量表达式,编译器会验证此变量的值是否是一个常量表达式。

[cpp]view plaincopy

intout_i = 0;// out_i定义于函数外部

...

constexprintmf = 20;

constexprintlimit = mf + 1;

constexprint*p4 = &out_i;

// the following would cause a make error

// since large is not a constexpr

//constexpr int wrong = large + 1;

// since &in_j is not a constexpr;

//int in_j = 0;

//constexpr int *p5 = &in_j;

值得注意的是,constexpr指针可以指向非常量变量,只要此变量定义于函数之外,因为这样的变量的指针(地址)是可以在编译期确定的。

另外,下面的constexpr指针与const指针的含义是完全不同的:

[cpp]view plaincopy

constexprint*p6 = nullptr;// a const pointer point to an int

// p6 = &out_i; // error: p6 is a constexpr

constint*p7 = nullptr;// a pointer point to a const int

第一个指针表示一个常量指针,即指针的值是常量;而第二个指针表示一个指向const int的指针,即指针指向的值是常量。

constexpr还可以用于函数,constexpr函数是指能用于常量表达式的函数,它遵循以下几条约定:

a.返回类型是字面值类型

b.形参类型是字面值类型

c.函数体中必须有且仅有一条return语句

[cpp]view plaincopy

constexprintsz() {return42; }

constexprintnew_sz(intcnt) {returnsz() * cnt; }

constexprintsize = sz();

constexprintnsize = new_sz(mf);

//constexpr int wrong_size = new_sz(out_i); // error: out_i is not a constexpr

cout<<"test constexpr: "<

noexcept

noexcept可以用作异常指示符,用于指示一个函数是否会抛出异常。编译器并不检查使用了noexcept的函数是否真的不抛出异常,在运行时,如果一个使用noexcept承诺不抛出异常的函数实际抛出了异常,那么程序会直接终止。

[cpp]view plaincopy

voidno_except() noexcept

{

throw1;

}

// the following call will cause terminate

//no_except();

noexcept还可以带参数,noexcept(true)表示不会抛出异常,noexcept(false)表示可能抛出异常。

同时noexcept还可以用作运算符,接受一个函数调用,返回一个bool值表示是否会抛出异常。noexcept运算符并不会对其实参进行求值。

将noexcept运算符,结合带参数的noexcept指示符,可以得到如下常用法:

[cpp]view plaincopy

voidno_except2() noexcept(noexcept(no_except())){}

cout<<"test noexcept: "<

这种用法表示no_except2和no_except的异常说明保持一致。

初始化

列表初始化

C++11新标准中为很多类型增加了列表初始化的功能。

可以用列表初始化一个简单变量。

[cpp]view plaincopy

intsingle_int1 = 0;

intsingle_int2 = {0};

cout<<"test list initialization:\n"<

可以用列表初始化一个容器(vector,list,map,set…)。

[cpp]view plaincopy

// vector/list list initialization

vector v1 = {"ab","cd","ef"};

list l2{"gh","ij","kl"};

//vector v3("mn", "op", "qr"); // wrong initialization format

cout<<"test vector/list list initialization:\n"<

// map/set list initialization

map m1 =

{

{"a","A"},

{"b","B"},

{"c","C"}

};

m1.insert({"d","D"});

set s1 = {"a","b","c"};

cout<<"test map/set list initialization:\n"<

可以在使用new动态分配内存时使用列表初始化。

[cpp]view plaincopy

vector *pv =newvector{0, 1, 2, 3, 4};

int*pi =newint[5]{0, 1, 2, 3, 4};

cout<<"test new alloator using list initialization:\n"<<(*pv)[2]<<'\t'<

可以在传入参数/函数返回值时使用列表初始化。

[cpp]view plaincopy

m1.insert({"d","D"});

vector error_msg(inttyp)

{

switch(typ)

{

case1:

return{"type1","msg1"};

case2:

return{"type2","msg2"};

default:

return{};

}

}

pair get_pair(inttyp)

{

if(typ == 1)return{"key","value"};

returnpair("default key","default value");

}

vector err_msg1 = error_msg(1);

vector err_msg2 = error_msg(2);

vector err_msg3 = error_msg(3);

cout<<"test return value list initialization:\n"<

pair p1 = get_pair(1);

pair p2 = get_pair(2);

cout<<"test return pair list initialization:\n"<

类内成员初始化

C++11标准中允许直接对类内成员进行初始化/列表初始化。

[cpp]view plaincopy

classInitClass

{

public:

voidprint_class()

{

cout<

}

private:

intfield1 = 1;

intfield2;

doublefield3 = 1.0;

doublefield4;

};

classInitClassMgr

{

public:

vector init_objs = {InitClass()};

};

InitClass test_class;

cout<<"test class member initialization:\n";

test_class.print_class();

InitClassMgr mgr;

cout<<"test class member of class type initialization:\n";

mgr.init_objs[0].print_class();

总结

long long类型。

nullptr字面量用于表示空指针。

constexpr用于表示常量表达式。

noexcept可以用于指示一个函数是否会抛出异常,同时可以用作运算符判定一个函数是否承诺不抛出异常。

新增基础类型、容器类型、new分配内存时的列表初始化。构建临时变量时也可以直接使用列表初始化。

可以直接对类内成员进行初始化/列表初始化。

完整代码详见new_type_and_keywords.cppinitialize.cpp

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

推荐阅读更多精彩内容