C++必知必会:统一的类成员初始化语法与std::initializer_list<T>
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 = 某个整型值;
};
即:
- static
- const
- 整型
在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;
相关文章
- MacOS 配置Clion的C/C++环境的详细步骤及mac终端报错问题解决(完整版)
- C++中引用和匿名对象的理解和本质剖析
- 【VS开发】C++ opencv Mat基础
- C++STL模板库序列容器之List容器
- C++中的关键字用法---typename
- C++初阶-list的使用及模拟
- [c++] Why should I use Smart Pointers
- [c++] Sequence Containers
- c++编译器对多态的实现原理总结
- C++一些注意点之转换操作符
- 《高质量c++/c编程指南》学习摘要
- C++学习笔记_16 线性容器-List容器 2021-05-13
- c/c++开源库推荐清单
- C++018-C++桶排序及其应用
- C++中list的erase()函数问题
- c++: 获取delete[]中的数组大小