在 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 =

最低0.47元/天 解锁文章
4767

被折叠的 条评论
为什么被折叠?



