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

posted @   AntangBots  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示