现代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练:初始化列表的主要内容,如果未能解决你的问题,请参考以下文章

现代C++实践100练:为什么使用nullptr代替NULL?因为它更加风骚

网课资源共享:现代C++实战30讲完结

现代C++实战30讲,资深架构师带你编写高性能代码

现代C++笔记

百度云资源:66 现代C++实战30讲

低价现代C++实战30讲完结