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.pswp.cn/bicheng/77773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77773.shtml
英文地址,請注明出處:http://en.pswp.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;傳統的人工篩選方法面臨著工作量大、效率低且容易出錯的問題。因此&…