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<int> v = {1, 2, 3};
return 0;
}
这里可以当作简单的语法糖,但是当我们期望传入一个{}(<brace-enclosed initializer list>)
来初始化一个类内部的vector
该如何呢?
class Test_Class_A {
public:
//virtual ~Test_Class_A() {};
Test_Class_A(std::initializer_list<int> l): data(l) {
};
std::vector<int> data;
};
int main() {
Test_Class_A tca = { 1, 2, 3};
return 0;
}
写到这里,感觉到C++
这样的语言期望能实现很多非常优良的特性,很多时候为了某一个点就需要引入一个新的概念,比如remove_reference
、initializer_list
、左值引用;和C
语言的"精简"已经渐行渐远了
网友评论