C++ 17中的初始化那些事

在 C++17 中,变量、结构体和类的初始化方式得到了显著增强和统一,主要得益于统一初始化语法(Uniform Initialization)和聚合初始化(Aggregate Initialization)的改进。C++17 还引入了结构化绑定(Structured Bindings)等特性,使初始化更加简洁和安全。

下面我将详细讲解 C++17 中的初始化方式、注意事项,并提供丰富的示例。

一、基本变量初始化

1. 常见初始化方式

// C++17 支持多种初始化方式
int a = 5;              // 复制初始化
int b(5);               // 直接初始化
int c{5};               // 列表初始化(推荐)
int d = {5};            // 复制列表初始化

// 推荐使用列表初始化,因为它可以防止窄化转换(narrowing conversion)
double x = 3.14159;
int e{x};               // 错误!窄化转换(double -> int),编译报错
int f = {3.14};         // 同样错误
int g{3};               // 正确

推荐:使用 {} 进行列表初始化

  • 防止窄化转换
  • 语法统一
  • 在 STL 容器中广泛使用

二、结构体(struct)初始化

1. 聚合类型(Aggregate Type)

C++17 中,如果结构体是聚合类型(无用户定义构造函数、无虚函数、无私有/保护非静态成员、无基类等),可以使用聚合初始化

struct Point {
    int x;
    int y;
};

// C++17 支持多种初始化方式
Point p1 = {1, 2};      // 复制列表初始化
Point p2{3, 4};          // 直接列表初始化(推荐)
Point p3();              // 注意:这是函数声明!不是初始化对象

// C++17 聚合类也支持类内默认成员初始化
struct Rectangle {
    Point topLeft{0, 0};
    Point bottomRight{10, 10};
};

Rectangle r1;           // 使用默认值
Rectangle r2{
  
  {1,1}, {5,5}}; // 自定义值

2. 带默认值的结构体

struct Person {
    std::string name = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

semicolon_helloword

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值