只谈C++11新特性 - 初始化列表

初始化列表

C++11 引入了一个强大的功能:初始化列表(std::initializer_list)。它为容器、类和普通函数的初始化提供了一种简洁而统一的语法。

什么是初始化列表

初始化列表是一种标准库类型,用于存储由花括号 {} 包围的一组值。它允许以统一的方式将一组值传递给函数、构造对象或初始化容器。

语法形式如下:

std::initializer_list<T>

其中,T 是列表中元素的类型。

使用场景

1. 容器初始化

C++11 允许直接使用初始化列表来初始化标准容器,例如 std::vectorstd::array
在 C++11 标准之前,std::vector 必须通过显式调用构造函数进行初始化,例如:

std::vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
numbers.push_back(5);

C++11 引入列表初始化后,可以直接写成:

std::vector<int> numbers = { 1, 2, 3, 4, 5 };

或写成

std::vector<int> numbers { 1, 2, 3, 4, 5 };

std::vector<int> 的实现中是这样的:

vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());
注意:

std::vector<int> numbers = { 1, 2, 3, 4, 5 }; 中,= 被称为 拷贝列表初始化(Copy List Initialization)。
如果省略 =,即写成 std::vector<int> numbers{ 1, 2, 3, 4, 5 };,则是 直接列表初始化(Direct List Initialization)。
在多数情况下,两者行为相同,但省略 = 更加高效,因为省去了潜在的拷贝操作。

示例代码
#include <iostream>
#include <vector>

int main() {
   
    std::vector<int> vec = {
   1, 2, 3, 4, 5}; // 使用初始化列表初始化

    for (int v : vec) {
   
        std::cout << v << " ";
    }
    return 0;
}

输出:

1 2 3 4 5

2. 自定义类的初始化

初始化列表可以作为构造函数的参数,用于简化对象的初始化。

示例代码
#include <iostream>
#include <initializer_list>

class MyClass {
   
public:
    MyClass(std::initializer_list<int> list) {
   
        for (int value : list) {
   
            std::cout << value << " ";
        }
    }
};

int main() {
   
    MyClass obj = {
   10, 20, 30, 40}; // 使用初始化列表初始化
    return 0;
}

输出:

10 20 30 40

自定义类提供匹配的构造函数

#include <iostream>
#include <initializer_list>

class MyClass {
   
private:
    int a, b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值