c++11新特性 自定义类型的列表初始化

1.概要

c++11新特性 自定义类型的列表初始化
class A
{
    int a;
    int b;
};
vector<A> vec = { {1,2},{3,4} };

2.代码

#include <iostream>
#include <vector>

using namespace std;

class A
{
public:
	A(int a, int b) {
		this->a = a;
		this->b = b;
	}
	void view() {
		cout<<"a:" << a <<"  b:" << b << "\n";
	}
private:
	int a;
	int b;
};

int main()
{
	vector<A> vec = { {1,2},{3,4} };
	for (A v : vec) {
		v.view();
	}
    std::cout << "Hello World!\n";
}

3.结果

a:1  b:2
a:3  b:4
Hello World!

4.关联知识

1.自定义类型的列表初始化

在C++11中,引入了列表初始化(list initialization),这是一项非常强大的特性,它允许使用花括号 {} 来初始化对象。这项特性不仅简化了代码的书写,还提高了代码的可读性和安全性。对于自定义类型,列表初始化可以通过一些方式加以支持。以下是如何为自定义类型启用列表初始化的几个关键步骤:

1. 构造函数

为了让你的自定义类型支持列表初始化,你需要定义一个合适的构造函数。通常,这意味着你需要一个可以接受 std::initializer_list 参数的构造函数。例如:


#include <iostream>
#include <initializer_list>
#include <vector>

class MyClass {
public:
    MyClass(std::initializer_list<int> list) {
        for (auto value : list) {
            data.push_back(value);
        }
    }
    
    void print() const {
        for (const auto& value : data) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }

private:
    std::vector<int> data;
};

int main() {
    MyClass obj = {1, 2, 3, 4, 5};
    obj.print(); // 输出: 1 2 3 4 5
    return 0;
}

在这个例子中,MyClass 有一个使用 std::initializer_list<int> 作为参数的构造函数,使得可以用 {1, 2, 3, 4, 5} 来初始化 MyClass 的对象。

2. std::initializer_list

std::initializer_list 是一个轻量级的类模板,专门用于支持初始化列表。它提供了对列表中元素的只读访问,因此非常适合用于构造函数的参数。

3. 默认构造函数和列表构造函数结合

你可以同时提供默认构造函数和接受 std::initializer_list 的构造函数,以便对象可以用不同的方式进行初始化。例如:


class MyClass {
public:
    MyClass() {
        // 默认构造
    }

    MyClass(std::initializer_list<int> list) {
        for (auto value : list) {
            data.push_back(value);
        }
    }
    
    // 其他成员函数...

private:
    std::vector<int> data;
};

4. 防止窄化转换

需要注意的是,列表初始化可能会引发窄化转换(narrowing conversion)问题,例如将 double 转换为 int。在设计构造函数时,要小心处理这种情况,以避免意外的数据丢失。

C++11的列表初始化为自定义类型提供了一种简单且一致的方式来初始化对象,这不仅提高了代码的可读性,还使得代码更加简洁和易于维护。通过合理使用 std::initializer_list,你可以为你的自定义类型增加对列表初始化的支持。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值