C++总结之:列表初始化
C++ 11之前的初始化方式
C++ 11之前初始化的方式可以分为:直接初始化、拷贝初始化和大括号列表初始化
直接初始化
这个最好理解,直接用显式的构造调用初始化,基本数据类型同样适用
int j(0);
Foo bar(123); //Foo is a class
拷贝初始化
int i = 0;
Foo foo = 123; //Foo is a class
大括号列表初始化
这种列表初始化方式仅限于有限的几种类型:数组和POD类型(plain old data 类型,指的是这样一些数据类型:基本数据类型、指针、union、数组、构造函数是 trivial 的 struct 或者 class等与C相兼容的数据类型,可以按照C的方式来处理(运算、拷贝等))
int i_arr[3] = { 1, 2, 3 };
struct A
{
int x;
struct B
{
int i;
int j;
} b;
} a = { 1, { 2, 3 } }; //POD类型
C++ 11提供了统一的列表初始化方式
C++ 11使得用花括号来初始化变量得到全面应用,不仅仅局限于数组和POD类型,所有C++类型均可以使用列表初始化。{}可以出现在直接初始化也可以出现在拷贝初始化,还可以出现在new申请动态类型时。
int i1 = 1;
int i2(2);
int i3{3};
int i4 = {4};
int *pi5 = new int{5};
int *pi6 = new int[2]{6, 7};
float f1 = float{1.1};
// Base(int i, float f);
Base b1(1, 0.1);
Base b2 = {2, 0.2};
Base b3{3, 0.3};
struct Foo
{
Foo(int, double) {}
};
Foo func(void)
{
return { 123, 321.0 };
//or return Foo{ 123, 321.0 };
} // 这里的 return 语句就如同返回了一个 Foo(123, 321.0)。
这种列表初始化方式,应用于内置类型变量时,有一个重要特点:如果使用列表初始化且初始值存在丢失信息的风险,编译器会报错。
int a = {3.1415};// error
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏