【C++ 20进阶(3):初始化 Initializer

发布于:2024-12-18 ⋅ 阅读:(143) ⋅ 点赞:(0)

【C++ 20进阶(3):初始化 Initializer】

原文:https://blog.csdn.net/weixin_44259356/article/details/144377955

引言

本篇文章为系列文章将着重介绍C++20新特性,一是希望可以和大家交流分享,二是也便于自己巩固学习

历史系列:

【C++ 20进阶(1):模块导入 import】
【C++ 20进阶(2):属性 Attribute】

0,介绍

本次主要介绍C++变量相关一些初始化,重点为C++20新增初始方式,之前版本有的重要内容也会有介绍

1,initializer_list

主要用于变量的初始化参数数量不定的情况,用例如下:

import <initializer_list>;
using namespace std;
int sum(initializer_list<int> values)
{
    int sum{0};
    for (int value : values) {
        sum += value;
    }
    return sum;
}

int a {sum({1})};
int b {sum({ 1,2,3,4,5 })}; // 任意数量都行

2,统一初始化{}

初始化方式有好几种, 这里主要介绍C++ 11之后常用方便的写法,如:

struct StructA
{
    int x;
    double y;
    char z{'Z'};
};

class ClassB
{
public:
    ClassB(int&& x, double&& y, char&& z) // 右值引用,减少数据拷贝,后续系列会有介绍
    {
        mX = x;
        mY = y;
        mZ = z;
    }

private:
    int mX;
    double mY;
    char mZ;
};

StructA structA{1,1.2,'A'}; // 推荐写法
ClassB classB{1,1.2,'B'}; // 推荐写法 C++11之后与ClassB classB = (1,1.2,'B'); 等价

另外还可以防止类型收窄

void func(int i) {}

int main()
{
    func(1.1); // 不会报错,但是会丢失精度
    func({1.1}); // 会直接报错,收缩转换失效
    return 0;
}

3,Designated Initializers【指定初始化】

上述StructA在C++20中还可以这么写:

StructA structA{
    .x = 1,
    .y = 1.2,
}; // 必须按照变量定义顺序初始化,可自定义想初始化的变量

那么这么做有什么好处呢?指定初始化可以指定需要初始的内容,像是变量z如果不需要额外初始化则可以直接不指定,此时变量z的值便为默认的‘Z’。另外可以防止重载决议错误:

struct StructA
{
    int x;
    double y;
    char z{'Z'};
};

struct StructB
{
    int x;
    double y;
};

void func(StructA a) {}
void func(StructB b) {}

int main()
{
    func({
        .x = 1,
        .y = 1.2,
        }); // 错误,类型匹配失败,会报错
    func({
        .x = 1,
        .y = 1.2,
        .z = 'A',
        }); // 正确
    return 0;
}

4,for初始化器

上一章我们就用过if初始化器,现在在C++20下for也可这么来写:

 for (array arr{ 1, 2, 3, 4 }; int i : arr)
 { 
 }

网站公告

今日签到

点亮在社区的每一天
去签到