美文网首页
列表初始化

列表初始化

作者: shelldon1024 | 来源:发表于2019-12-31 12:20 被阅读0次

对于类对象的初始化,可以使用传统的构造方式(使用圆括号),也可以使用列表初始化(使用花括号)。

假设有如下类的定义(没有接受 initializer_list 类型参数的构造函数):

class Person {
private:
    int weight;
    int height;
    string name;
public:
    Person(int w, int h): weight(w), height(h), name("unknown") {
    }
    
    Person(int w, int h, string n): weight(w), height(h), name(n) {  
    }
};

初始化示例:

Person person1(1, 2);             //示例1,调用第一个构造函数
Person person2(1, 2, "haha");     //示例2,调用第二个构造函数
Person person3{1, 2};             //示例3,调用第一个构造函数
Person person4{1, 2, "haha"};     //示例4,调用第二个构造函数
Person person5 = {1, 2, "haha"};  //示例5,调用第二个构造函数
Person person6({1, 2, "haha"});   //示例6,调用第二个构造函数

如果为 Person 类添加接受 initializer_list 类型参数的构造函数

class Person {
private:
    int weight;
    int height;
    string name;
    
public:
    Person(int w, int h): weight(w), height(h), name("unknown") {
    }
    
    Person(int w, int h, string n): weight(w), height(h), name(n) { 
    }
    
    Person(initializer_list<int> il): name("unknown") {
        if (il.size() < 2) {
            weight = -1;
            height = -1;
        } else {
            auto iter = il.begin();
            weight = *iter++;
            height = *iter;
        }
    }
};

初始化示例:

Person person1(1, 2);             //示例1,调用第一个构造函数
Person person2(1, 2, "haha");     //示例2,调用第二个构造函数
Person person3{1, 2};             //示例3,调用了第三个构造函数
Person person4{1, 2, "haha"};     //示例4,由于列表类型不是initializer_list<int>,所以不能调用第三个构造函数;列表内参数类型与第二个构造函数匹配,调用第二个构造函数
Person person5 = {1, 2, "haha"};  //示例5,调用第二个构造函数
Person person6({1, 2, "haha"});   //示例6,调用了第二个构造函数

总结

  1. Object obj = {param1, param2, ...};Object obj({param1, param2, ...});可以直接写成Object obj{param1, param2, ...};
  2. Object obj{param1, param2, ...};会先去匹配 Object 的接受 initializer_list 类型参数的构造函数,即尝试调用Object obj({param1, param2, ...}),如果匹配不到,然后再去匹配Object obj(param1, param2, ...);

相关文章

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

  • C++的初始化列表和列表初始化

    C++的初始化列表和列表初始化 初始化列表 初始化列表是声明在构造函数中来实现的,相当于初始化,而不是复制操作 初...

  • C++初始化列表

    引言 用c++的人都知道,c++的构造函数具有初始化列表,初始化列表有什么作用?什么情况下必须使用初始化列表...

  • C++11——变量和基础类型

    列表初始化(List Initialization) 当初始化列表与内置类型的变量一起使用时,这种初始化形式具有一...

  • c++11新特性之列表初始化

    C++11新增了列表初始化的概念。 在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。 列表初始...

  • C++11中的初始化列表

    1 初始化列表 C++98/03中可以使用初始化列表对普通数组、POD类型等进行初始化。如: 但是这种初始化方式的...

  • 2020-09-15 构造函数初始化列表

    使用初始化列表的构造函数,其显式地对成员进行初始化 未使用初始化列表的构造函数,其通过赋值来对成员进行初始化(此赋...

  • 类的组合

    组合类构造函数一般的定义形式如下: 内嵌对象的初始化使用了 初始化列表 来完成——内嵌对象必须使用初始化列表来实现...

  • 跳跃表

    Skip List定义 Skip List 完整实现 下面是跳表的基本操作 节点的创建 列表的初始化列表的初始化需...

  • C++初始化列表 多态

    初始化列表 特点 一种便捷的初始化成员变量的方式 只能在构造函数中 初始化列表与默认参数配合使用 如果函数的声明和...

网友评论

      本文标题:列表初始化

      本文链接:https://www.haomeiwen.com/subject/jcdboctx.html