c++基础·列表初始化

目录

 一、列表初始化的核心优势

二、基础数据类型与数组初始化

1. 基础类型初始化

2. 数组初始化

三、类与结构体初始化

1. 构造函数匹配规则

2. 注意事项

四、标准容器初始化

五、聚合类型(Aggregate Types)初始化

1. 聚合类型定义

2. 初始化规则

六、总结与实践建议

最佳实践

性能提示

拓:聚合类型条件解析:"无私有或保护的非静态成员"

1. 聚合类型定义条件表格

2. 关键概念解释


 一、列表初始化的核心优势

        列表初始化(List Initialization)是C++11引入的统一初始化语法,其核心优势体现在以下方面:

    1. 语法统一性
      传统初始化方式包括=赋值、()构造函数调用、{}聚合初始化等,而列表初始化通过统一的{}语法覆盖了以下场景:

      int x{5};              // 基础类型 
      std::vector<int> v{1,2,3}; // 容器 
      Point p{10, 20};       // 自定义类 

    2. 隐式窄化检查
      禁止可能导致数据丢失的隐式转换,例如:

      int a = 3.14;       // 编译通过(丢失精度)
      int b{3.14};        // 编译错误!类型窄化 

    3. 动态长度支持
      可接受任意长度的初始化列表,尤其适用于容器和聚合类型:

      int arr[]{1,2,3,4,5};    // 数组长度自动推导为5 
      std::list<int> lst{10};  // 初始化含单个元素10的链表 
      


    二、基础数据类型与数组初始化

    1. 基础类型初始化

    传统初始化与列表初始化对比:

    int x = 5;      // 传统赋值 
    int y{5};       // 列表初始化(推荐)
    int z{};        // 默认初始化为0 
    

    2. 数组初始化

    支持自动长度推导省略等号的简洁语法:

    int arr1[] = {1,2,3};     // C++03风格 
    int arr2[]{4,5,6};        // C++11风格(自动推导长度)
    char str[]{"Hello"};      // 字符串数组初始化 

    三、类与结构体初始化

    1. 构造函数匹配规则

    • 若类定义了std::initializer_list构造函数,优先调用该构造函数

      class Widget {
      public:Widget(std::initializer_list<int> list) {// 处理初始化列表...}
      };
      Widget w{1,2,3};  // 调用initializer_list构造 
      

    • 若无initializer_list构造,则匹配参数数量最接近的普通构造函数:

      class Point {
      public:Point(int x, int y) {...}
      };
      Point p{10, 20};  // 调用Point(int, int)
      

    2. 注意事项

    当存在参数类型歧义时,列表初始化可能引发意外行为:

    std::vector<int> v1(5, 1); // 包含5个1:[1,1,1,1,1]
    std::vector<int> v2{5, 1}; // 包含两个元素:[5,1]

    四、标准容器初始化

    列表初始化彻底改变了容器的使用体验:

    // 初始化容器元素 
    std::vector<int> vec{1,2,3,4,5}; // 嵌套容器初始化 
    std::map<int, std::string> m{{1, "Alice"}, {2, "Bob"}
    };// 动态分配容器 
    auto p = new std::list<std::string>{"cpp", "java", "python"};

    五、聚合类型(Aggregate Types)初始化

    1. 聚合类型定义

    满足以下条件的类/结构体:

    • 无用户自定义构造函数
    • 无私有或保护的非静态成员
    • 无基类和虚函数

    2. 初始化规则

    按成员声明顺序初始化,支持嵌套初始化:

    struct Address {std::string city;int zipcode;
    };struct Person {std::string name;int age;Address addr;
    };Person p{"Tom", 30, {"Shanghai", 200000}};

    六、总结与实践建议

    最佳实践

    1. 优先使用列表初始化替代=()初始化
    2. 警惕auto推导陷阱
      auto x{5}; 在C++11中推导为std::initializer_list<int>
    3. 自定义类型设计
      若需要支持不定长初始化,应实现std::initializer_list构造函数

    性能提示

    列表初始化可能引入临时对象构造开销,在性能敏感场景建议进行基准测试。

    拓:聚合类型条件解析:"无私有或保护的非静态成员"

1. 聚合类型定义条件表格
条件符合要求的示例不符合要求的示例违反后果
无用户自定义构造函数struct A { int x; };struct B { B(){} int x; };无法使用B{1}初始化
无私有/保护的非静态成员struct C { int a; public: int b; };struct D { private: int x; };无法直接列表初始化私有成员
无基类(C++11~C++17)struct E { int x; };struct F : E {};C++20前无法聚合初始化派生类
无虚函数struct G { int x; };struct H { virtual void f(){} };无法使用H{}初始化
2. 关键概念解释

"无私有/保护的非静态成员"

  • 含义:所有非静态数据成员必须是公有(public)访问权限
  • 技术背景:列表初始化需要直接访问成员,私有成员需通过构造函数赋值
  • 示例分析
    struct Valid {int a;         // public(默认)public: int b; // 显式public 
    };
    Valid v{1, 2};    // 成功:成员均为public struct Invalid {private: int x; // 私有成员 
    };
    Invalid i{5};      // 错误:无法访问私有成员 

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

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

相关文章

数据分析与产品、运营、市场之间如何有效对齐

数据分析的重要性在于它能够将海量的原始信息转化为可操作的洞察。以产品开发为例,通过用户行为数据的分析,产品经理可以清晰了解哪些功能被频繁使用,哪些设计导致用户流失,从而优化迭代方向。运营团队则依靠数据分析来监控供应链效率、预测需求波动,甚至通过实时数据调整…

[C]基础11.深入理解指针(3)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、字符指针变量2、数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化&#xff1f; 3、二维数组传参的本质4、函数指针变量4.1 函数指针变量…

【漏洞复现】CVE-2024-38856(ApacheOfbiz RCE)

【漏洞复现】CVE-2024-38856&#xff08;ApacheOfbiz RCE&#xff09; 1. 漏洞描述 Apache OFBiz 是一个开源的企业资源规划&#xff08;ERP&#xff09;系统。它提供了一套企业应用程序&#xff0c;用于集成和自动化企业的许多业务流程。 这个漏洞是由于对 CVE-2023-51467 的…

C++入门小馆: 深入string类(二)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【nginx】服务的信号控制

目录 1. 说明2. 常用信号及作用3. 信号控制的具体操作3.1 获取 Nginx 主进程 PID3.2 发送信号 4. 应用场景4.1 重新加载配置文件4.2 日志切割 5. 平滑升级 Nginx6. 注意事项 1. 说明 1.Nginx 的信号控制是其管理服务的重要机制&#xff0c;通过向主进程发送特定信号&#xff0…

Ubuntu下展锐刷机工具spd_dump使用说明

spd_dump使用说明 源码地址&#xff1a;https://github.com/ilyakurdyukov/spreadtrum_flash 编译环境准备&#xff1a; sudo apt update sudo apt install git sudo apt install build-essential sudo apt install libusb-1.0-0-devIf you create /etc/udev/rules.d/80-spd…

鸿蒙NEXT开发LRUCache缓存工具类(单例模式)(ArkTs)

import { util } from kit.ArkTS;/*** LRUCache缓存工具类&#xff08;单例模式&#xff09;* author 鸿蒙布道师* since 2025/04/21*/ export class LRUCacheUtil {private static instance: LRUCacheUtil;private lruCache: util.LRUCache<string, any>;/*** 私有构造函…

笔记:react中 父组件怎么获取子组件中的属性或方法

在子组件中我们可以使用下面两个方法去暴露你所要放行的属性或方法&#x1f447; 1.useImperativeHandle 2.orwardRef 搭配使用例子 import React, { useState, forwardRef, useImperativeHandle } from "react"function Son(props, ref) {const [data] useStat…

《浔川代码编辑器v2.0内测(完整)报告》

一、测试概述 浔川代码编辑器v2.0经过为期五周的封闭内测&#xff0c;累计提交了186份测试报告。本次内测主要针对v2.0新增的多语言支持、AI辅助编码、性能优化等核心功能进行全面验证。 二、测试环境 - 硬件配置&#xff1a;i7-12700H/16GB RAM/512GB SSD - 操作系统&#xf…

ubuntu18.04安装QT问题汇总

1、Could not determine which ”make“ command to run. Check the ”make“ step in the build configuration.” sudo apt-get install clang sudo apt-get install build-essential sudo apt-get install libqt4-dev 2、fatal error: sqlite3.h: No such …

基于单片机的BMS热管理功能设计

标题:基于单片机的BMS热管理功能设计 内容:1.摘要 摘要&#xff1a;在电动汽车和储能系统中&#xff0c;电池管理系统&#xff08;BMS&#xff09;的热管理功能至关重要&#xff0c;它直接影响电池的性能、寿命和安全性。本文的目的是设计一种基于单片机的BMS热管理功能。采用…

CSS基础-即学即用 -- 笔记1

目录 前言CSS 基础1. 层叠样式表来源理解优先级源码顺序经验法则继承inherit 关键字initial 关键字 2. 相对单位em 和 rem响应式面板视口的相对单位使用vw定义字号使用calc()定义字号自定义属性&#xff08;即CSS变量&#xff09; 3. 盒模型调整盒模型 前言 只需一分钟就能学会…

Linux中服务器时间同步

简单介绍 在 redhat 8 之前&#xff0c;时间同步服务是使用 NTP&#xff08;网络时间协议&#xff09;来实现的&#xff0c;在 redhat 8 及之 后使用是 NTP 的实现工具 chrony 来实现时间同步。 在 redhat 8 及之后&#xff0c;默认情况下已经安装好 chrony 软件并已经开机启…

让SQL飞起来:搭建企业AI应用的SQL性能优化实战

我上一篇文章已经讲解过了如何使用公开的AI模型来优化SQL.但这个优化方法存在一定的局限性.因为公开的AI模型并不了解你的数据表结构是什么从而导致提供的优化建议不太准确.而sql表结构又是至关重要的安全问题,是不能泄露出去的.所以在此背景下我决定搭建一个自己的AI应用在内网…

小迪安全-112-yii反序列化链,某达oa,某商场,影响分析

yii是和tp一样的框架 入口文件 web目录下 相对tp比较简单一些&#xff0c;对比tp找一下他的url结构 对应的位置结构 这个contorllers文件的actionindex就是触发的方法 控制器&#xff0c;指向的index文件&#xff0c;就可以去视图模块看index文件 这就是前端展示的文件 自…

自定义多头注意力模型:从代码实现到训练优化

引言 在自然语言处理和序列生成任务中,自注意力机制(Self-Attention)是提升模型性能的关键技术。本文将通过一个自定义的PyTorch模型实现,展示如何构建一个结合多头注意力与前馈网络的序列生成模型(如文本或字符生成)。该模型通过创新的 MaxStateSuper 模块实现动态特征…

动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染

动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…

Java 泛型使用教程

简介 Java 泛型是 JDK 5 引入的一项特性&#xff0c;它提供了编译时类型安全检测机制&#xff0c;允许在编译时检测出非法的类型。泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 泛型的好处&#xff1a; 编译期检查类型安全 避免强制类型转…

Leetcode - 周赛446

目录 一、3522. 执行指令后的得分二、3523. 非递减数组的最大长度三、3524. 求出数组的 X 值 I四、3525. 求出数组的 X 值 II 一、3522. 执行指令后的得分 题目链接 本题就是一道模拟题&#xff0c;代码如下&#xff1a; class Solution {public long calculateScore(String…

【更新完毕】2025泰迪杯数据挖掘竞赛A题数学建模思路代码文章教学:竞赛论文初步筛选系统

完整内容请看文末最后的推广群 基于自然语言处理的竞赛论文初步筛选系统 基于多模态分析的竞赛论文自动筛选与重复检测模型 摘要 随着大学生竞赛规模的不断扩大&#xff0c;参赛论文的数量激增&#xff0c;传统的人工筛选方法面临着工作量大、效率低且容易出错的问题。因此&…