C++基础面试题 | 什么是C++的列表初始化?

青山相待,白云相爱,梦不到紫罗袍共黄金带。 - 《山坡羊·道情》(宋方壶)

2024.8.26

回答重点

C++11中引入了列表初始化,其语法是用花括号{}来初始化变量或对象。列表初始化可以应用于:

  • 基础数据类型
  • 用户自定义类型(类、结构体等)
  • 其他容器

列表初始化的好处包括:

  • 方便,基本上可以替代普通括号初始化
  • 可以使用初始化列表接受任意长度
  • 可以防止类型窄化,避免精度丢失的隐式类型转换

列表初始化的几个用法示例

  1. 基础数据类型

    int a{10}; // 列表初始化
    int a={19}; // 列表初始化(也可以不使用等号)
    
  2. 初始化数组

    int arr[3] = {1, 2, 3}; // 使用花括号初始化数组
    
  3. 类对象初始化,构造函数需要支持列表初始化:

    class Point {
    public:int x, y;Point(int a, int b) : x{a}, y{b} {}
    };
    Point p{1, 2}; // 使用花括号初始化对象
    
  4. 容器初始化

    std::vector<int> vec = {1, 2, 3, 4}; // 使用花括号初始化容器
    
  5. 防止类型窄化

  • 列表初始化不允许隐式类型转换,这可以防止类型窄化,即从更宽的类型转换到更窄的类型时可能发生的精度丢失。
  • 示例:尝试将浮点数3.14初始化给整型变量x,会触发编译错误,因为这是类型窄化。
  1. 聚合类型的列表初始化
  • 聚合类型是指没有用户定义的构造函数、没有私有或受保护的非静态数据成员、没有基类以及没有虚函数的类、结构体或联合体。
  • 对于聚合类型,列表初始化会直接按顺序初始化其成员。
  • 示例:
    struct Aggregate {int a;double b;
    };Aggregate agg{1, 2.3}; // 初始化a为1, b为2.3
    

扩展知识

什么是类型窄化?

  • 类型窄化包括以下几种情况:
    • 从浮点类型到整数类型的转换。
    • long doubledoublefloat的转换,以及从doublefloat的转换,除非源是常量表达式且不发生溢出。
    • 从整数或无作用域枚举类型到不能表示原类型所有值的整数类型的转换,除非源是其值能完全存储于目标类型的常量表达式。

一句话,类型窄化就是类型转化过程中的精度丢失。

int main() {int a = 1.2; // okint b = {1.2}; // errorfloat c = 1e70; // okfloat d = {1e70}; // errorfloat e = (unsigned long long)-1; // okfloat f = {(unsigned long long)-1}; // errorfloat g = (unsigned long long)1; // okfloat h = {(unsigned long long)1}; // okconst int i = 1000;const int j = 2;char k = i; // okchar l = {i}; // errorchar m = j; // okchar m = {j}; // ok,因为是const类型,这里如果去掉const属性,也会报错
}

自定义类实现列表初始化:initializer_list

struct CustomVec {std::vector<int> data;CustomVec(std::initializer_list<int> list) {for (auto iter = list.begin(); iter != list.end(); ++iter) {data.push_back(*iter);}}
};

特别注意,initializer_list不能引用传递、不能引用传递、不能引用传递!!(内部已做效率优化)

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

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

相关文章

云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX

随着物联网、边缘计算技术的发展&#xff0c;实现边缘服务的快速部署对于分布式计算环境至关重要。它不仅可以显著降低延迟、节省带宽资源、增强数据的安全性和隐私保护&#xff0c;同时还能改善用户体验&#xff0c;支持动态变化的工作负载需求&#xff0c;提供更高的灵活性和…

Linux 实时调度器:带宽限制

文章目录 1. 前言2. 概念3. 实时进程 的 带宽限制3.1 实时进程 带宽限制 初始化3.2 启动 实时进程 带宽 监测定时器3.3 累加 实时进程 消耗的带宽3.4 查看 实时进程 带宽消耗情况3.5 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的…

JAVA毕业设计165—基于Java+Springboot+vue3的二手房交易管理系统(源代码+数据库+11000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的二手房交易管理系统(源代码数据库11000字论文)165 一、系统介绍 本项目前后端分离(还有ssm版本)&#xff0c;分为用户、卖家、管理员三种角色 1、用户&a…

TOMCAT-企业级WEB应用服务器

一 WEB技术 1.1 HTTP协议和B/S 结构 HTTP&#xff08;HyperText Transfer Protocol&#xff09;协议即超文本传输协议&#xff0c;是用于在万维网&#xff08;WWW&#xff09;上传输超文本内容的基础协议。 一、HTTP 协议的特点 1、简单快速 客户向服务器请求服务时&#…

leetcode234. 回文链表(java实现)

题目描述&#xff1a; 本道题的思路可以使用集合先存储链表的值&#xff0c;然后进行判断即可。 总体思路比较简单。 代码实现&#xff1a; class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList();ListNode cur head;whil…

Python lambda(匿名函数)

Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的、内联函数&#xff0c;它可以具有任意数量的参数&#xff0c;但只能有一个表达式。 匿名函数不需要使用 def 关键字定义完整函数。 lambda 函数通常用于编写简单的、单行的函数&#xff0c;通常在需要函…

代谢组数据分析(十八):随机森林构建代谢组诊断模型

介绍 使用随机森林算法和LASSO特征选择构建了一种胃癌(GC)诊断预测模型。参与者(队列1,n=426)通过随机分层抽样分为发现数据集(n=284)和测试集(n=142)。接下来,在发现数据集上执行LASSO回归,以选择能够识别胃癌患者的较少数量的特征。我们将L1约束的系数设置为0.01…

OpenCV绘图函数(3)判断点一条直线是否在一个矩形范围内的函数clipLine()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 裁剪线段与图像矩形相交的部分。 cv::clipLine 函数计算出完全位于指定矩形内的线段部分。如果线段完全位于矩形之外&#xff0c;则返回 false。…

2024年小红书图文制作超火爆风格,1单19.9!趣味性插画AI表情包项目思路

今天我想跟大家分享一个每天只需花20分钟就能轻松赚钱的AI表情包项目。 这个项目在小红书上非常受欢迎&#xff0c;因为它符合小红书的用户习惯&#xff0c;而且操作简单。下面我来详细讲讲如何利用软件快速创作有趣的插画&#xff01; 项目简介 这个项目的原理很简单&#x…

工厂模式和策略模式区别以及使用

1. 简介 1.1. 概述 1.1.1. 工厂模式 工厂模式的核心思想是将对象的创建过程封装起来,使得客户端(Caller)不需要直接与具体类(Concrete Class)交互,而是通过一个接口(Interface)来与它们交互。这样做的好处是,当需要更改对象的创建方式时,只需修改工厂方法即可,无需…

计算机网络-2-tcpip协议

1.说说 TCP/IP 四层模型&#xff1f; TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型是一种用于描述互联网通信的协议层次结构。它分为四个主要层次&#xff0c;每个层次都定义了不同的协议来实现特定的功能。下面是TCP/IP模型各层的常用…

AES对称加密算法

1. 简介 AES是一种对称加密算法, 它有3种类型: AES-128: 密钥为128位(16字节)的AES, 加密10轮AES-192: 密钥为192位(24字节)的AES, 加密12轮AES-256: 密钥为256位(32字节)的AES, 加密14轮 密钥长度越长, 加密的强度越大, 当然与此同时开销也越大。每种类型下都有几种操作模式…

Python序列化与反序列化:pickle库使用详解

pickle是Python中一个用于对象序列化与反序列化的模块。它可以将Python对象转换成字节流&#xff0c;这样这些对象就可以容易地存储到文件中&#xff0c;或者通过网络传输。同样地&#xff0c;pickle也可以将这些字节流重新转换成原来的Python对象。 pickle库的主要功能 将Py…

给自己复盘的tjxt笔记day9

优惠券管理 开发流程 需求分析&#xff0c;接口统计&#xff0c;数据库设计&#xff0c;创建分支&#xff0c;创建新模块&#xff08;依赖&#xff0c;配置&#xff0c;启动类&#xff09;&#xff0c;生成代码&#xff0c;引入枚举状态 优惠券管理 增删改查的业务代码&#…

NC 数组中的最长连续子序列

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定无序数组…

前端算法 === 力扣 111 二叉树的最小深度

目录 问题描述 DFS&#xff08;深度优先搜索&#xff09;方案 BFS&#xff08;广度优先搜索&#xff09;方案 总结 力扣&#xff08;LeetCode&#xff09;上的题目111是关于二叉树的最小深度问题。这个问题可以通过深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&…

python 实现二维矩阵运算的函数算法

二维矩阵运算的函数算法介绍 在二维矩阵运算中&#xff0c;除了之前提到的加法和乘法之外&#xff0c;还有其他一些常见的运算&#xff0c;如矩阵的转置、求逆&#xff08;针对方阵且行列式不为零&#xff09;、点积&#xff08;也称为内积&#xff0c;但通常不直接用于整个矩…

科技温柔拥抱梦乡!康姿百德柔压磁性枕舒适与科技的甜蜜邂逅

解锁未来睡眠新姿势&#xff01;康姿百德柔压磁性枕&#xff0c;科技护航每一夜好梦 在现代家居产品的设计中&#xff0c;科技与舒适性的结合越来越受到人们的关注。康姿百德柔压磁性枕正是一款将科技与舒适结合的产品&#xff0c;为现代生活注入了新的活力。 康姿百德柔压磁性…

Jmeter下载、配置环境变量

Jmeter下载 下载地址&#xff1a;Apache JMeter - Download Apache JMeter 下载后无需安装&#xff0c;解压后即可使用。解压后目录如下 配置环境变量 JMETER_HOME 环境变量Path %JMETER_HOME%\bin 环境变量CLASSPATH %JMETER_HOME%\lib 验证是否配置成功 在cmd命令窗中 输入…

JetBrains Rider 2024 for Mac/Win:跨平台.NET IDE集成开发环境的全面解析

JetBrains Rider 2024作为一款专为Mac和Windows用户设计的跨平台.NET IDE集成开发环境&#xff0c;以其强大的功能和卓越的性能&#xff0c;在.NET开发领域脱颖而出。这款IDE不仅集成了IntelliJ IDEA的代码编辑优势&#xff0c;还融合了ReSharper的C#开发体验&#xff0c;为开发…