cpp11的初始化列表
时间: 2023-06-01 09:02:44 浏览: 57
C++11引入了更灵活和简洁的初始化列表语法,允许在声明对象时使用初始化列表来初始化对象的成员变量。以下是一些C++11初始化列表的用法:
1. 用花括号{}初始化数组和结构体
```
int arr[] = {1, 2, 3};
struct Point {
int x;
int y;
};
Point p = {0, 0};
```
2. 用花括号{}初始化STL容器
```
std::vector<int> v = {1, 2, 3};
std::map<std::string, int> m = {{"one", 1}, {"two", 2}, {"three", 3}};
```
3. 使用构造函数的初始化列表
```
class MyClass {
public:
MyClass(int a, int b) : x(a), y(b) {}
private:
int x;
int y;
};
MyClass obj(1, 2);
```
4. 使用auto关键字和花括号{}进行类型推导
```
auto i = {1, 2, 3}; // 推导出std::initializer_list<int>
```
相关问题
cpp14的初始化列表
C++14引入了以下新特性来扩展初始化列表:
1. 初始化列表支持泛型编程:在模板类中使用初始化列表时,可以声明一个泛型类型T,并使用T来初始化列表。
2. 简化了对于复制和移动语义的支持:通过使用“= default”语法,可以轻松地为类生成默认的复制和移动构造函数。
3. 初始化列表中支持使用auto:在初始化列表中,可以使用auto关键字来推断变量类型,从而更加简化代码。
4. 初始化列表中支持使用Lambda表达式:Lambda表达式可以在初始化列表中使用,从而为对象的初始化提供更加灵活的方式。
5. 初始化列表中支持使用constexpr:可以使用constexpr关键字来定义初始化列表中的常量表达式,从而提高程序的性能和可读性。
总之,C++14的初始化列表提供了更加灵活和强大的初始化方式,使得编写C++代码变得更加简单和高效。
cpp17的初始化列表
C++17的初始化列表没有明显的变化,它仍然是在构造函数中使用花括号括起来的一组值,用于初始化类的成员变量。例如:
```c++
class MyClass {
public:
MyClass(int a, int b, int c) : x(a), y(b), z(c) {}
private:
int x, y, z;
};
MyClass obj{1, 2, 3}; // 使用初始化列表初始化MyClass对象
```
在上面的例子中,构造函数使用初始化列表将参数a、b和c分别赋值给类的成员变量x、y和z。在创建MyClass对象时,使用花括号括起来的一组值来初始化它。
C++17没有引入新的初始化列表语法或语义,但它增加了一些支持类模板参数推断和复合类型的变化。例如:
```c++
template <typename T>
class MyClass {
public:
MyClass(T a, T b, T c) : x(a), y(b), z(c) {}
private:
T x, y, z;
};
MyClass obj{1, 2, 3}; // 类模板参数T被推断为int类型
```
在上面的例子中,MyClass是一个类模板,它接受一个类型参数T。使用初始化列表初始化MyClass对象时,编译器可以通过对象的类型推断出T的类型为int。因此,可以使用简化的语法来初始化MyClass对象,而无需指定T的类型。
除此之外,C++17还增加了对复合类型的初始化列表支持,例如std::array、std::pair和std::tuple。例如:
```c++
std::array<int, 3> arr{1, 2, 3}; // 使用初始化列表初始化std::array对象
std::pair<int, std::string> p{1, "hello"}; // 使用初始化列表初始化std::pair对象
std::tuple<int, double, std::string> t{1, 3.14, "hello"}; // 使用初始化列表初始化std::tuple对象
```
在上面的例子中,使用初始化列表初始化了std::array、std::pair和std::tuple对象。这些复合类型都支持使用初始化列表来初始化它们的元素。