《C++11》各种初始化方式的详细列举与对比

生成特定比例卡通程序员图片.png

在 C++ 中,初始化对象的方式多种多样。随着 C++ 标准的演进,特别是 C++11 的引入,初始化方式得到了显著的扩展和改进。本文将详细列举 C++ 中的各种初始化方式,并对它们进行对比,帮助开发者更好地理解和应用这些特性。

1. C++98/C++03 的初始化方式

在 C++98 和 C++03 中,主要有以下几种初始化方式:

1.1 直接初始化(Direct Initialization)

使用构造函数直接初始化对象。

int a(5);                     // 直接初始化整数
std::vector<int> v(5, 1);    // 直接初始化 STL 容器,创建一个包含 5 个元素的 vector,每个元素为 1

1.2 复制初始化(Copy Initialization)

使用赋值操作符 = 进行初始化。

int b = 5;                    // 复制初始化整数
std::vector<int> w = std::vector<int>(5, 1); // 复制初始化 STL 容器

1.3 动态初始化(Dynamic Initialization)

使用 new 关键字动态分配内存并初始化对象。

int* p = new int(5);         // 动态初始化整数
std::vector<int>* vec = new std::vector<int>(5, 1); // 动态初始化 STL 容器

1.4 列表初始化(List Initialization)

在 C++98/C++03 中并不支持列表初始化,但可以使用初始化列表来初始化数组。

int arr[5] = {1, 2, 3, 4, 5}; // 初始化数组

2. C++11 及之后的初始化方式

C++11 引入了列表初始化,并对其他初始化方式进行了改进。以下是 C++11 及之后的初始化方式:

2.1 列表初始化(List Initialization)

使用大括号 {} 来初始化对象。

int a = {5};                    // 列表初始化整数
std::vector<int> v = {1, 2, 3}; // 列表初始化 STL 容器
2.1.1 命名列表初始化

可以为元组或结构体的成员命名(C++20 支持)。

struct Point {int x;int y;
};Point p = { .x = 1, .y = 2 }; // C++20 支持的命名初始化

2.2 直接初始化(Direct Initialization)

C++11 继续支持直接初始化。

int a(5);                     // 直接初始化整数
std::vector<int> v(5, 1);    // 直接初始化 STL 容器

2.3 复制初始化(Copy Initialization)

C++11 继续支持复制初始化。

int b = 5;                    // 复制初始化整数
std::vector<int> w = {1, 2, 3}; // 复制初始化 STL 容器

2.4 动态初始化(Dynamic Initialization)

C++11 继续支持动态初始化。

int* p = new int(5);         // 动态初始化整数
std::vector<int>* vec = new std::vector<int>{1, 2, 3}; // 动态初始化 STL 容器

2.5 统一初始化(Uniform Initialization)

C++11 引入的统一初始化方式,使用大括号 {},可以用于所有类型的对象。

int a{5};                     // 统一初始化整数
std::vector<int> v{1, 2, 3};  // 统一初始化 STL 容器

2.6 初始化类的非静态成员

在类定义中,可以直接使用列表初始化来初始化非静态成员。

struct Point {int x{0}; // 列表初始化int y{0};
};

2.7 结构体和类的初始化

C++11 允许使用列表初始化来初始化结构体和类。

struct Point {int x;int y;
};Point p{1, 2}; // 使用列表初始化结构体

3. 各种初始化方式的对比

初始化方式C++98/C++03C++11 及之后
直接初始化
复制初始化
动态初始化
列表初始化×
统一初始化×
防止窄化转换×√ (仅列表初始化)
初始化类的非静态成员×√ (仅列表初始化)
命名初始化×√ (C++20)

4. 深入理解 C++11 及以后的新特性

在 C++ 中,特别是 C++11 及以后的版本中,以下几个概念是非常重要的,它们帮助开发者编写更安全和更易于维护的代码。

4.1 防止窄化转换

定义

窄化转换(Narrowing Conversion)是指将一个较大范围的类型转换为一个较小范围的类型,这种转换可能会导致数据丢失。例如,将 double 转换为 int,或者将 long 转换为 short

示例
double d = 3.14;
int a = d; // 这是窄化转换,可能导致数据丢失

在 C++11 中,使用列表初始化(如 {})时,编译器会检查是否存在窄化转换。如果存在,编译器会报错,从而防止潜在的数据丢失。

int a = {3.14}; // 错误:窄化转换
优点
  • 安全性:防止了意外的数据丢失,增强了代码的安全性。
  • 可读性:通过编译器的错误提示,开发者可以更清晰地了解潜在的问题。

4.2 初始化类的非静态成员

定义

在 C++11 中,可以在类的定义中直接使用列表初始化来初始化非静态成员变量。这种方式使得类的构造更加简洁和直观。

示例
struct Point {int x{0}; // 列表初始化,x 默认初始化为 0int y{0}; // 列表初始化,y 默认初始化为 0
};Point p; // 创建 Point 对象,x 和 y 都会被初始化为 0
优点
  • 简洁性:在类定义中直接初始化成员变量,减少了构造函数的复杂性。
  • 可读性:使得类的默认状态更加明确,便于理解。

4.3 命名初始化

定义

命名初始化(Named Initialization)是指在初始化结构体或类时,可以为成员指定名称。这种特性在 C++20 中得到了正式支持,但在 C++11 中并没有直接的命名初始化语法。

示例(C++20)
struct Point {int x;int y;
};Point p{.x = 1, .y = 2}; // 使用命名初始化
优点
  • 可读性:通过为成员命名,代码的可读性大大提高,特别是在结构体或类有多个成员时。
  • 灵活性:可以在初始化时只指定部分成员,未指定的成员会使用默认值。

注意

在 C++11 中,虽然没有直接的命名初始化语法,但可以通过构造函数或其他方式实现类似的效果。

5. 总结

C++ 的初始化方式随着标准的演进而不断丰富,特别是 C++11 引入的列表初始化和统一初始化,使得代码更加简洁和安全。不同的初始化方式各有其适用场景,开发者可以根据具体需求选择合适的方式进行对象的初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 Python Django 的西西家居全屋定制系统(源码+部署+文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

25考研|重邮软件工程复试攻略!

与计算机一样&#xff0c;重邮复试不合格也很有可能被淘汰&#xff01;快快认真准备起来&#xff01; 一、复试内容 1、笔试&#xff1a;分值100 2、综合面试&#xff1a;满分100 主要考核考生的综合素质和业务能力&#xff0c;由各招生学院具体组织实施&#xff0c;综合面试…

如何制作重识别数据集及如何解决all query identities do not appear in gallery的问题

如何制作重识别数据集 数据集制作链接 注意点&#xff1a; 按照上述方式制作完成数据集之后&#xff0c;分别建立3个文件夹&#xff0c;分别为train&#xff0c;test&#xff0c;query&#xff0c; 值得注意的是&#xff0c;query文件里的相机编号要进行修改&#xff0c;修改…

链地址法(哈希桶)

链地址法&#xff08;哈希桶&#xff09; 解决冲突的思路 开放定址法中所有的元素都放到哈希表⾥&#xff0c;链地址法中所有的数据不再直接存储在哈希表中&#xff0c;哈希表 中存储⼀个指针&#xff0c;没有数据映射这个位置时&#xff0c;这个指针为空&#xff0c;有多个数…

【C语言】可移植性陷阱与缺陷(七): 除法运算时发生的截断

在C语言编程中&#xff0c;除法运算可能会引发一些与可移植性相关的问题&#xff0c;特别是当涉及到整数除法时发生的截断&#xff08;truncation&#xff09;。不同平台对于整数除法的行为和处理方式可能会有所不同&#xff0c;这可能导致代码在不同编译器或硬件平台上的行为不…

了解RabbitMQ的工作原理

RabbitMQ是一个开源的消息代理系统&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;。在现代分布式系统中&#xff0c;特别是在微服务架构中&#xff0c;RabbitMQ有广泛的应用。本文将详细介绍RabbitMQ的工作原理&#xff0c;并通过实践案例帮助读者理解和应用…

分布式搜索引擎之elasticsearch基本使用3

分布式搜索引擎之elasticsearch基本使用3 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&…

【FlutterDart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)

上效果 预期的是通过拖动一条边界线改变窗口大小&#xff0c;类似vscode里拖动效果。这个是简单的拖动实现 上代码&#xff1a; import package:flutter/material.dart;class MyDraggableViewDemo extends StatelessWidget {const MyDraggableViewDemo({super.key});override…

使用Dinky快速提交Flink operator任务

官网地址&#xff1a;K8s集成 | Dinky 1.目前使用版本 Dinky1.2.0、Flink1.18.1、Flink operator0.10.0 2.制作镜像 2.1创建DockerFile ARG FLINK_VERSION1.18.1 FROM flink:${FLINK_VERSION}-scala_2.12 RUN mkdir -p /opt/flink/usrlib COPY commons-cli-1.3.1.jar …

查找路由器的管理后台ip【通用找IP】

需求&#xff1a; 刚刚搞了个【小米】路由器&#xff0c;我想进路由的管理后台&#xff0c;提示&#xff1a;安装xx的路由管家&#xff0c;我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继&#xff0c;那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

【通识安全】煤气中毒急救的处置

1.煤气中毒的主要症状与体征一氧化碳中毒&#xff0c;其中毒症状一般分为轻、中、重三种。 (1)轻度&#xff1a;仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗&#xff0c;或将病人移出中毒环境&#xff0c;使之吸入新鲜空气和休息&#xff0c;给些热饮料&am…

【UI自动化测试】selenium八种定位方式

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac;&am…

redis各种数据类型介绍

Redis 是一种高性能的键值存储数据库&#xff0c;它支持多种数据类型&#xff0c;使得开发者可以灵活地存储和操作数据。以下是 Redis 支持的主要数据类型及其介绍&#xff1a; 1. 字符串&#xff08;String&#xff09; 字符串是 Redis 中最基本的数据类型&#xff0c;它可以存…

【Linux】Linux命令

目录 ​编辑 系统维护命令 man man&#xff1a;查看 man 手册 sudo passwd 用户名&#xff1a;修改用户密码 su&#xff1a;切换用户 echo ”输出内容“&#xff1a;向终端输出内容&#xff0c;默认换行 date查看当前系统的日期 clear&#xff1a;清屏 df -Th /df -h&…

关机重启后,GitLab服务异常

整理机房,关闭了所有主机重新上架。 上架后开机,所有主机硬件启动正常。 其中一台GitLab服务器启动正常,使用gitlab-ctl status查看服务业正常。 但使用web登陆却失败,如下图: 反复测试,发现无论使用正确密码还是错误密码都是同样的提示。很大可能是数据库的问题。 使…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

Python编程实例-特征向量与特征值编程实现

特征向量与特征值编程实现 文章目录 特征向量与特征值编程实现1、什么是特征向量2、特征向量背后的直觉3、为什么特征向量很重要?4、如何计算特征向量?4、特征向量Python实现5、可视化特征向量6、总结线性代数是许多高级数学概念的基石,广泛应用于数据科学、机器学习、计算机…

基于Java的免税商品优选购物商城设计与实现源码(springboot+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于Java的免税商品优选购物商城设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Java的免税…

Docker安装(Docker Engine安装)

一、Docker Engine和Desktop区别 Docker Engine 核心组件&#xff1a;Docker Engine是Docker的核心运行时引擎&#xff0c;负责构建、运行和管理容器。它包括守护进程&#xff08;dockerd&#xff09;、API和命令行工具客户端&#xff08;docker&#xff09;。适用环境&#…