当前位置: 首页 > news >正文

【C++11】列表初始化

📝前言:
这篇文章我们来讲讲C++11引入的列表初始化{},注意这不是构造函数里的初始化列表!!!
在阅读文章之前,请你记住一句重点万物皆可{}初始化

🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏,Linux


列表初始化

  • 一,C++98 的 {}
  • 二,C++11 的 {}
    • 初始化内置类型
    • 初始化自定义类型
    • 隐式类型转换
    • initializer_list

一,C++98 的 {}

C++98 中,一般数组结构体可以用{}进行初始化
如:

struct Date
{Date(int year = 1945, int month = 9, int day = 3):_year(year),_month(month),_day(day){}int _year;int _month;int _day;
};int main()
{// 数组int a[] = { 1,2,3,4 };// 结构体Date d1 = { 2025, 4, 25 };return 0;
}

二,C++11 的 {}

C++11 以后,⼀切对象皆可用{}初始化{}初始化也叫做列表初始化)

{}初始化的特点:

  • 内置类型支持,自定义类型也支持,自定义类型本质是类型转换,中间会产生临时对象,优化了以后变成直接构造
  • {}初始化的过程中,可以省略掉=(两者在编译器不优化时,过程略有区别)

初始化内置类型

以下三种写法效果相同⬇️

int a = 11;
int b = { 11 };
int c{ 11 };

在这里插入图片描述

初始化自定义类型

以下两种写法结果相同,但过程略有区别⬇️

Date d1 = { 2025 };
Date d2{ 2025, 4 };

本质:

  • d1:先用{2025}构造一个Date临时对象(第二、三个参数用缺省值),再用临时对象拷贝构造d1。(编译器优化,合二为一以后就是:用{2025}直接构造d1
  • d2:直接使用提供的初始化值 { 2025, 4 } 来调用 Date 合适的构造函数(即使编译器不优化也是一样)

其他引用场景⬇️

vector<Date> v;
v.push_back(d1); // 插入有名对象
v.push_back(Date(2025, 1, 1)); // 插入匿名对象// 更好用的:用{2025, 1, 1}构造一个临时对象
v.push_back({ 2025, 1, 1 });

隐式类型转换

再看Date d1 = { 2025 };:其实是调用构造函数进行隐式类型转换,即:2025变成Date类型

C++98 已经支持了单参数构造函数的隐式类型转换

Date d1 = { 2025 };
Date d2 = 2025; //与 d1 效果相同

C++11 以后,也支持多参数的:

Date d3 = { 2025, 4, 25 };

如果,想禁止构造函数用于隐式类型转换,可以在构造函数之前加:explicit

explicit Date(int year = 1945, int month = 9, int day = 3)
// 以下就无法执行:
// Date d1 = { 2025 };
// Date d3 = { 2025, 4, 25 };

在这里插入图片描述

initializer_list

initializer_list{}初始化插上翅膀!
在这里插入图片描述
在这里插入图片描述
std::initializer_list的本质是底层开⼀个数组,将数据拷贝过来,内部有两个指针分别指向数组的开始和结束

有什么作用呢?

STL中的容器都增加了⼀个initializer_list的构造,容器的赋值也支持使用initializer_list

示例1:

vector<int> v1{ 1,2,3,4,5 }; // 和 vector<int> v1({ 1,2,3,4,5 }); 一样
vector<int> v2 = { 1,2,3,4,5 };

说明:

  • v1:直接用initializer_list: {1,2,3,4,5}来构造
  • v2:用initializer_list: {1,2,3,4,5}构造一个临时对象,然后再用临时对象拷贝构造v2【不过编译器优化成:{1,2,3,4,5}直接构造v2

示例2:

map<string, string> dict1{ {"left","左边"},{"right", "右边"}};

说明:
{"left","左边"}隐式类型转换成pair,然后用一个元素为pairinitializer_list直接构造dict1

示例3:

vector<int> v3;
v3 = { 10,20,30,40,50 };

说明:
initializer_list的赋值支持


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

  • 第34课 常用快捷操作——按“空格键”旋转图元
  • 使用 binlog2sql 闪回 MySQL8 数据
  • 高精度运算(string函数)
  • 生成式AI全栈入侵:当GPT-4开始自动编写你的Next.js路由时,人类开发者该如何重新定义存在价值?
  • Java多态终极指南:从基础到高级应用
  • 前端技术个人求职简历模板
  • 股指期货成交量是单边还是双边?
  • NVIDIA GPU 计算能力与 COLMAP 编译配置指南【2025最新版!!!】
  • 【AI提示词】战略顾问
  • 侵水防触电的原理是什么? 侵水防触电算先进技术吗?-优雅草卓伊凡
  • 计算机视觉——对比YOLOv12、YOLOv11、和基于Darknet的YOLOv7的微调对比
  • mmap详解
  • SpringBoot中暗藏的设计模式
  • RabbitMQ全栈实践手册:从零搭建消息中间件到SpringAMQP高阶玩法
  • 【后端】主从单体数据库故障自动切换,容灾与高可用
  • 2025最新Facefusion3.1.2使用Docker部署,保姆级教程,无需配置环境
  • 29、简要描述三层架构开发模式以及三层架构有哪些好处?
  • Maven进阶知识
  • Python循环语句-for循环(基础语法,range语句,临时变量作用域,嵌套应用)
  • 数据结构与算法-单链表专题
  • 辽宁省信访局副局长于江调任辽宁省监狱管理局局长
  • 钟声:美以芬太尼为借口滥施关税,纯属“内病外治”
  • 万能险新规落地:保险期限不得低于五年,明确万能险销售“负面清单”
  • 临沂文旅集团被诉侵权,原告每年三百余起类案
  • 对排出黑烟车辆出具合格报告,广州南沙一检测公司被罚十万元
  • 印媒称印巴在克什米尔控制线沿线发生小规模交火,巴方暂未回应