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,你可以为你的自定义类型增加对列表初始化的支持。
1026

被折叠的 条评论
为什么被折叠?



