现代C++实战100练:初始化列表
Posted CodeBowl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现代C++实战100练:初始化列表相关的知识,希望对你有一定的参考价值。
在讲这个问题之前,我想先说下本文的风格,这也是我写作的风格,通常我不会像教科书一般上来就直说概念和道理,我喜欢用已知,大家可以理解的问题去引入一个知识,这是我自己的学习方法,也希望介绍给大家。
同时你可以在文章开头,看到你将通过本文了解到什么,再决定去不去花费时间阅读,毕竟时间很宝贵。
您可以通过本文了解到什么
什么是初始化列表
什么是POD类型
C++11之后,对初始化列表做了什么改变
建议您在以后的开发使用初始化列表,这将有一些帮助!
C++11前的初始化列表
在C++11之前,就有了初始化列表这个概念了。
但是在那时不同的对象有着不同的初始化方法,例如普通数组、POD (Plain Old Data,即没有构造、析构和虚函 数的类或结构体)类型都可以使用 {} 进行初始化,也就是我们所说的初始化列表。而对于类对象的初始 化,要么需要通过拷贝构造、要么就需要使用 () 进行。这些不同方法都针对各自对象,不能通用。
POD类型:Plain Old Data,即没有构造、析构和虚函 数的类或结构体
数组和POD的初始化
int arr[3] = {1, 2, 3};
std::vector<int> vec = {1, 2, 3, 4, 5};
类的初始化
class Foo
{
public:
int value_a;
int value_b;
Foo(int a, int b) : value_a(a), value_b(b) {}
};
//初始化
Foo foo(1, 2);
C++11之后的初始化列表
虽然C++11之前的初始化,使用起来没有什么问题,但是作为程序员,都是”懒惰“的,我们总是想着怎么再简单一点,所以C++11推出了新特性 ”初始化列表“
为了解决这个问题,C++11 首先把初始化列表的概念绑定到了类型上,并将其称之为 std::initializer_list, 允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普通数组和 POD 的初 始化方法提供了统一的桥梁,例如:
#include <initializer_list>]
#include<iostream>
#include <vector>
class CMagicFoo
{
public:
std::vector<int> vec;
CMagicFoo(std::initializer_list<int> list)
{
for (std::initializer_list<int>::iterator it = list.begin(); it != list.end(); ++it)
{
vec.push_back(*it);
}
}
};
void InitList()
{
// after C++11
CMagicFoo magicFoo = { 1, 2, 3, 4, 5 };
std::cout << "magicFoo: "<<std::endl;
for (std::vector<int>::iterator it = magicFoo.vec.begin(); it != magicFoo.vec.end(); ++it)
{
std::cout << *it << std::endl;
}
}
总结
语法糖!
所有类型的初始化都可以使用初始化列表!
本文代码除了讲解了初始化列表的新特性,还有变量声明的的部分,如果有不了解这里的同学,可以查看我之前的文章《变量声明强化》
.
本文的代码地址: Modern_Cpp_Practice.
代码持续更新,欢迎下载测试,喜欢的给个star!
本系列将长期更新,希望对您有帮助,本文的代码风格参考Google代码风格,希望对您有借鉴!
以上是关于现代C++实战100练:初始化列表的主要内容,如果未能解决你的问题,请参考以下文章