C++11初始化列表与initializer_list

 在C++的世界里,对象初始化是一项基础而又重要的操作。C++11引入的初始化列表和 initializer_list 为对象初始化带来了更强大、更灵活和更安全的方式,极大地提升了代码的表达力和效率。
 
一,初始化列表的基本使用
 
初始化列表允许在定义对象时,使用花括号 {} 对其成员进行初始化,这种方式简洁直观,且在许多情况下可以避免不必要的默认构造和赋值操作。
 
对于普通的内置类型数组,在C++11之前,我们可能这样初始化:
 

int arr[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;


而在C++11中,可以使用初始化列表:
 

int arr[3] = {1, 2, 3};


对于自定义类,初始化列表同样大放异彩。假设我们有一个简单的类 Point :

class Point {
public:
    int x;
    int y;
    Point(int a, int b) : x(a), y(b) {}
};
 


在C++11之前,我们需要通过构造函数的参数来初始化成员变量。而有了初始化列表,我们可以这样创建对象:
 

Point p{3, 4};


这不仅简洁,还能确保成员变量按照声明顺序进行初始化,避免一些潜在的错误。
 
二,initializer_list的奥秘
 
 initializer_list 是C++11引入的一个标准库类型,它提供了一种方便的方式来处理初始化列表。 initializer_list 本质上是一个轻量级的容器,用于存储相同类型的一组值,并且这些值在其生命周期内是只读的。
 
很多标准库容器都支持使用 initializer_list 进行初始化。例如 std::vector 
 

#include <vector>
#include <iostream>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    for (int i : v) {
        std::cout << i << " ";
    }
    return 0;
}

在这个例子中, {1, 2, 3, 4, 5} 被自动转换为 std::initializer_list<int> ,然后传递给 std::vector 的构造函数,从而创建了一个包含五个元素的 vector 。
 
三,自定义类与initializer_list
 
我们也可以在自定义类中使用 initializer_list 。假设我们有一个表示集合的类 MySet ,希望支持通过初始化列表来添加元素:
 

#include <iostream>
#include <vector>

class MySet {
private:
    std::vector<int> data;
public:
    MySet(std::initializer_list<int> list) {
        for (int value : list) {
            data.push_back(value);
        }
    }

    void print() {
        for (int i : data) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    MySet set = {10, 20, 30};
    set.print();
    return 0;
}

在这个 MySet 类中,构造函数接受一个 std::initializer_list<int> 参数,通过遍历这个列表,将其中的元素添加到 std::vector 中,实现了灵活的初始化方式。
 
四,初始化列表与initializer_list的优势
 
一致性:初始化列表提供了统一的初始化语法,无论是内置类型、标准库容器还是自定义类,都可以使用花括号初始化,减少了不同初始化方式带来的混淆。
 
防止类型窄化:在使用初始化列表时,编译器会进行严格的类型检查,防止类型窄化。例如:
 

int a = 3.14; // 合法,但会发生类型窄化
int b{3.14}; // 编译错误,防止类型窄化


提高代码可读性:通过初始化列表和 initializer_list ,代码更加简洁明了,直观地展示了对象的初始状态,增强了代码的可读性和可维护性。
 
初始化列表和 initializer_list 是C++11中非常实用的特性,它们为对象初始化带来了诸多便利,成为现代C++编程中不可或缺的一部分,无论是日常开发还是大型项目,都值得开发者深入掌握和运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ylf_fengge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值