C++11标准常用特性---统一初始化

1、在给结构体赋值的时候,可以使用一对大括号来进行赋值,赋值过程中会按照结构体成员顺序来进行赋值;

struct initTest
{
    int nNum;
    string str;
};

initTest o = { 1, "初始化" }; //第一种初始化方式
initTest o2{ 1, "初始化" };   //第二种初始化方式

初始化的类型是否按照顺序指定的呢?
传入一个错误的类型试试,看下编译器会提示什么。

错误提示.png

从编译器的错误提示中可以看到,第一个参数类型已经被确定为int类型。

2、初始化列表初始化类

class initClass
{
public:
    initClass(int nC, string str) {};
};

initClass o = { 2, "初始化" }; //第一种初始化方式
initClass o2{ 1, "初始化" };   //第二种初始化方式

3、初始化同类型不定个数参数

C++11把初始化列表的概念绑到一个叫做std::initializer_list的模板上,这允许构造函数或其他函数将初始化列表做为参数.例如:

template<class T>
class initClass
{
public:
    initClass(initializer_list<T> initList) {};
};

initializer_list<int> oList{ 1, 2, 3, 4, 5, 6, 7 };
initClass<int> o{ oList };

initializer_list<double> oListd{ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 };
initClass<double> oD{ oListd };

这个构造函数是一种特殊的构造函数,叫做初始化列表构造函数(initializer-list-constructor)
\color{#FF3030}{类型std::initializer_list<>是个第一级的C++11标准程序库类型,但是,它们只能由C++11通过\{\}}
\color{#FF3030}{这个列表一经构造便可复制,虽然这只是copy-by-reference。初始化列表是常数;}
\color{#FF3030}{一旦被创建,其成员均不能被改变,成员中的数据也不能够被改变。}

函数统一类型入参也可以使用:

void FunctionName(initializer_list<float> list);  
FunctionName({1.0f, -3.45f, -0.4f}); 

4、标准容器的统一初始化

C++11之前初始化一个vector,需要调用多次push_back函数进行初始化。

vector<double> oDList;
oDList.push_back(1.0);
oDList.push_back(2.0);

C++11可以这么实现:

vector<double> oDList{ 1.0, 2.0 };
vector<double> oDList = { 1.0, 2.0 };
vector<double> oDList({ 1.0, 2.0 });

\color{#FF3030}{注意:这种方式初始化不同与add,所以循环内初始化还是需要使用push_back函数的。}

5、非静态类成员赋值

C++11之前只有静态成员在声明的时候可以赋初值。C++11让非静态成员也可以在声明的时候赋值。

class initClass
{
public:
    initClass() {};
private:
    int m_nC = 0;
    string m_str = "";
};

如果初始化列表对类initClass的两个赋过初值的成员变量进行了另外的初始化,那么赋值的内容会被覆盖。
小测试一下:
修改代码如下:

class initClass
{
public:
    initClass(const int nC, const string str) : m_nC(nC), m_str(str) {};

    int getNc() { return m_nC; };
    string getStr() { return m_str; };
private:
    int m_nC = 0;
    string m_str = "";
};

initClass test1{ 10, "test" };
cout << "initClass::m_nC:\t" << test1.getNc() << endl;
cout << "initClass::m_str:\t" << test1.getStr() << endl;

测试结果:


测试结果.png

6、对象构造的改进

C++11以前类的构造函数不允许调用该类的其它构造函数;每个构造函数都必须自己或者调用一个公共的成员函数来构造类的全部成员.例如:

class SomeType1
{
public:
    SomeType1(int new_number) : number(new_number) {}
    SomeType1() : number(42) {}
private:
    int number;
};

class SomeType2 
{
public:
    SomeType2(int new_number) { init(new_number); } //必须调用一个公共初始化函数进行初始化成员
    SomeType2() { init(42); }
private:
    void init(int new_number) { number = new_number; }

private:
    int number;
};

而且,基类的构造函数不能直接暴露给派生类;每个派生类必须实现自己的构造函数哪怕基类的构造函数已经够用了.非静态数据成员不能在声明的地方初始化.它们只能在构造函数中初始化.
C++11为这些问题提供了解决方案.C++11允许构造函数调用另一个构造函数(叫做委托构造).这允许构造函数利用其它构造函数的行为而只需增加少量的代码.C#,java和D语言都提供了这种功能. C++的语法如下:

class SomeType1
{
public:
    SomeType1(int new_number) : number(new_number) {}
    SomeType1() : SomeType1(42) {}
private:
    int number;
};

注意:这个例子可以通过给new_number设定一个默认参数来达到相同的效果.但是,这种新语法可以让这个默认值在实现中来设置而不是在接口中设置.这带来的一个好处就是,对库代码的维护者而言,在接口中(头文件中)声明默认值,这个默认值被嵌入到了调用端;要改变这个默认值的话,调用端的代码都需要重新编译.但委托构造可以在实现中(CPP文件中)来改变这个默认值, 这样调用端的代码就不需要重新编译,只用重新编译这个库就可以了.

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

推荐阅读更多精彩内容