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

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

初始化列表

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

初始化列表示例

class Test_A{
public:
    Test_A(): a(0) {

    }

private:
    int a;
};

  如代码中,跟随在构造函数声明冒号后的即是

初始化列表的好处

初始化列表是由其必要性的,比如const变量、引用、禁止复制构造函数的类、没有默认构造函数的类

  • 避免调用多次构造函数

列表初始化

C语言中直接使用{}定义且赋值的操作其实就可以称之为列表初始化

对象初始化

对象初始化比较复杂,涉及到很多的构造函数;这里只关注于使用列表这样的初始化方式

struct Test_ST_A {
    int  num;
    char *ptr;
    float fnum;
};
class Test_Class_A {
public:
    //virtual ~Test_Class_A() {};
    //Test_Class_A() {};
    int  num;
    char *ptr;
    float fnum;
private:
    //Test_Class_A(const Test_Class_A &) {};
};

int main() {
    Test_ST_A st_a = { 0, NULL, 1.1};

    Test_Class_A cla_a = { 0, NULL, 1.1};
    return 0;
}

  在C++中是可以直接使用{}包含多个参数直接对内部数据进行初始化的,并且这些参数的类型是可以不一致的;同时如果定义了构造函数、虚函数之类的则无法再这样初始化了,必须定义符合一致的Test_Class_A(int, const char* , float) {};构造函数方可。这就是列表初始化,调用的是构造函数哟

initializer_list

这个类主要是针对于容器来的,对于容器来说也应当想C语言中数组一样提供类似的初始化、赋值函数

int main() {
    std::vector v = {1, 2, 3};
    return 0;
}

  这里可以当作简单的语法糖,但是当我们期望传入一个{}()来初始化一个类内部的vector该如何呢?

class Test_Class_A {
public:
    //virtual ~Test_Class_A() {};
    Test_Class_A(std::initializer_list l): data(l) {
        
    };
    std::vector data;
};

int main() {
    Test_Class_A tca = { 1, 2, 3};
    return 0;
}

  写到这里,感觉到C++这样的语言期望能实现很多非常优良的特性,很多时候为了某一个点就需要引入一个新的概念,比如remove_referenceinitializer_list、左值引用;和C语言的"精简"已经渐行渐远了

你可能感兴趣的:(C++的初始化列表和列表初始化)