zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++必知必会:统一的类成员初始化语法与std::initializer_list<T>

C++List 语法 初始化 成员 统一 必会 必知
2023-09-27 14:29:25 时间

初始化列表

C++98构造函数

假设类A有一个类型为int数组的成员变量,在C++98/03中,如果要在构造函数中对这个成员变量进行初始化,需要这样写:

class A
{
public:
	A()
	{
		nums[0] = 1;
		nums[1] = 3;
		nums[2] = 5;
		nums[3] = 7;
	}
private:
	int nums[4];
};

对于字符数组,可能就需要在构造函数中使用strcpy、memcpy这一类函数了;再者,如果数组元素足够多,初始值又没什么规律,则这种赋值代码会有很多行,如果nums数组是一个局部变量,则我们在定义nums时可以使用如下语法对其进行初始化:

int nums[4] = {1, 5, 7, 9};

C++11初始化列表

所以在C++11中,对类成员变量也可以使用这种语法进行初始化

class A
{
public:
	A()
		: nums{1, 3, 5, 7}
	{}
private:
	int nums[4];
};

成员变量的初始值

在Java这类语言中定义一个类时,可以为其成员变量设置一个初始值,如下:

class A
{
	public int a = 1;
	public String string = "helloworld";
};

但在C++98/03标准中,对类的成员必须使用static const修饰,而且类型必须是整型(包括bool/char/int/long等),这样才能使用这种初始化语法:

template<typename T>
class A
{
public:
	// T是某个整型类型
	static const T num = 某个整型值;
};

即:

  1. static
  2. const
  3. 整型

在C++11标准中没有了这种限制,可以使用花括号对任意类型的变量进行初始化,而且不用是static类型

class A
{
public:
	bool	ma{ true };
	int		mb{ 2022 };
	string  mc{ "helloworld" };
};

当然,在实际开发中,建议将这些成员变量的初始化统一写到构造函数的初始化列表中。

如何在自定义类中实现

需要用到C++11新引入的对象std::initializer_list< T>了。它是一个模板对象,接受一个自定义参数类型T,T既可以是基础的数据类型,也可以是自定义的复杂数据类型。若要使用std::initializer_list< T>,需要包含头文件

#include <initializer_list>

示例:

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

class A
{
public:
	A(std::initializer_list<int> integers)
	{
		m_vecIntegers.insert(m_vecIntegers.end(), integers.begin(), integers.end());
	}

	~A() {}

	void append(std::initializer_list<int> integers)
	{
		m_vecIntegers.insert(m_vecIntegers.end(), integers.begin(), integers.end());
	}

	void print()
	{
		size_t size = m_vecIntegers.size();
		for (size_t i = 0; i < size; ++i)
		{
			std::cout << m_vecIntegers[i] << std::endl;
		}
	}
private:
	std::vector<int> m_vecIntegers;
};

int main(void)
{
	A a{ 1, 2, 3 };
	a.print();
	
	std::cout << "After append..." << std::endl;
	a.append({ 4, 5, 6 });
	a.print();

	return 0;
}

在这里插入图片描述

扩展

initializer_list< T>除了提供了构造函数,还有三个成员函数,这个和STL其他容器的同名方法用法一样:

// 返回列表中的元素个数
size_type size() const;
// 返回第一个元素的指针
const T* begin() const;
// 返回最后一个元素的下一个位置,代表结束
const T* end() const;