如果知道我会死在哪里,那我将永远不去那个地方 -查理 芒格
前言
初始化列表作为C++11引入的特性,不仅用于初始化变量,还可以用于初始化结构体,如
struct Point
{
int x;
int y;
};
void using_initial_list()
{
//初始化变量
auto channel_num{ 10 };
//初始化聚合体
Point p{ 10, 30 };
std::vector<int> vec{ 1,2 };//contains two elements, 1 and 2;
}
其中结构体Point就是聚合体,那么聚合体是什么呢,
聚合体
聚合体定义
聚合体是一种数据类型,其可以是:
//情形1
class People
{
public:
std::string m_name;
int m_age;
//People(std::string name, int age):m_name(name),m_age(age){}//非聚合体
//People(){}//非聚合体
};
//情形2
class Base {
public:
Base(int i, int j){};
int i =10;
int j =30;
};
class People:public Base//非聚合体
{
public:
std::string m_name;
int m_age;
};
//情形3:
class People
{
public:
std::string m_name;
int m_age;
private:
int math_score;//非聚合体
};
//情形4
class People
{
public:
std::string m_name;
int m_age;
virtual void worker(){};//非聚合体
};
网上部分资料认为聚合体不能有自定义的析构函数,但是在MSVC2022 C++20的编译环境下,具有自定义析构函数的仍被认为是聚合体
聚合体元素
聚合体中的元素为:
聚合体初始化
上文提到,可以直接使用初始化列表对聚合体进行初始化,C++20新增指派初始化器对聚合体进行初始化。指派初始化器是初始化列表的扩展,通过指定聚合体中的元素进行初始化
struct AudioInfo
{
int channel_num;
int channel_layout;
int sample_rate;
int frame_cout;
int bit_depth;
};
AudioInfo info1{1,1,48000,1024,16};//初始化列表
AudioInfo info2{ .channel_num = 1, .channel_layout {1}, .bit_depth=16, };//指派初始化器
聚合体初始化操作
常见错误
char cv[4] = {'a', 's', 'd', 'f', 0}; // 错误,多余元素个数
int x[] = {}; // 错误,空的初始化器列表初始化未知边界的数组
union u { int a; const char* b; };
u a = {1}; // OK:显式初始化成员 a
u b = {0, "asdf"}; // 错误:显式初始化两个成员
u c = {"asdf"}; // 错误:按元素声明顺序初始化,即不能以 "asdf" 初始化 int
// C++20 指派初始化器列表
u d = {.b = "asdf"}; // OK:可以显式初始化非开头元素
u e = {.a = 1, .b = "asdf"}; // 错误:显式初始化两个成员
u f{.a{10.0}};//错误,窄化转换
显示初始化元素规则
//example 1
struct S
{
union
{
int a;
int b;
};
int c;
};
S s{.a{10}, .c{30}};
//example 2
struct A
{
int x;
struct B
{
int b1;
int b2;
} b;
};
a = {1, {2, 3}}; // 以 1 初始化 a.x,以 2 初始化 a.b.b1,以 3 初始化 a.b.b2
a = {1, {2, 3.0}}; // error, 存在窄化转换
指派初始化器
以上其实已涉及导指派初始化器,但作为C++20新特性,着重介绍用法及特性如下:
//example 221
struct AudioInfo
{
int channel_num;
int channel_layout;
int sample_rate;
int frame_cout;
int bit_depth;
};
AudioInfo info{ .channel_num = 1, .channel_layout {1}, .bit_depth=16, };//sample_rate和frame_cout初始化为0
//example 222
struct AudioInfo
{
int channel_num;
int channel_layout;
int sample_rate;
int frame_cout;
int bit_depth;
};//example 222
struct AudioInfo
{
int channel_num;
int channel_layout;
int sample_rate;
int frame_cout;
int bit_depth;
};
AudioInfo info{ .channel_num = 1, .channel_layout {1}, .bit_depth=16.0, };//error,double类型的16.0需要转换为int型,报错
//example 223
struct S
{
union
{
int a;
int b;
};
int c;
};
S s{.a{10}, .c{30}};
union u { int a; const char* b; };
u f = {.b = "asdf"}; // OK:联合体的活跃成员是 b
u g = {.a = 1, .b = "asdf"}; // 错误:只可提供一个初始化器
//example 224
struct C
{
string str;
int a = 2;
int b= -1;
};
A{.b = 21} //使用{}初始化str, 使用2初始化a,使用21初始化b
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有