最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn)

 更新時(shí)間:2026年02月08日 10:14:34   作者:GuSir  
本文主要介紹了c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一. 變量初始化

int a = 1;、int b(2); 兩種寫法,無統(tǒng)一標(biāo)準(zhǔn)

// 主函數(shù):程序執(zhí)行的起點(diǎn)(必須有且僅有一個(gè))
int main() {
    // 基本類型:統(tǒng)一用 {},支持省略等號(hào)
    int a{1};       // 等價(jià)于 int a = 1;
    double b{3.14}; // 無隱式類型轉(zhuǎn)換(如寫 b{3} 沒問題,但 b{3.14f} 也沒問題,嚴(yán)格來說是窄化轉(zhuǎn)換被禁止)

    std::cout << "Hello GCC! 這是C++主程序" << std::endl;  // 控制臺(tái)輸出內(nèi)容
    return 0;  // 程序正常退出(返回0表示成功)
}

二. 數(shù)組初始化

int arr[] = {1,2,3};` 對(duì)于聚合對(duì)象有區(qū)別

// main.cpp:C++ 主程序入口
#include <iostream>  // 包含輸入輸出流庫(cout 所需)

struct teacher {
    int id;         // 成員1:編號(hào)
    const char* name; // 成員2:姓名
    int age;        // 成員3:年齡
};

// 主函數(shù):程序執(zhí)行的起點(diǎn)(必須有且僅有一個(gè))
int main() {
    // 驗(yàn)證1:單個(gè)對(duì)象的聚合初始化(C++11+支持,C++03不支持)
    teacher t1 = {101, "Zhang San", 35}; // 等號(hào)可選
    teacher t2{102, "Li Si", 40};        // C++11+ 允許省略等號(hào)(列表初始化)

    // 驗(yàn)證2:數(shù)組的聚合初始化(直接用成員值,而非已創(chuàng)建對(duì)象)(C++11+支持,C++03不支持)
    teacher arr[] = {
        {103, "Wang Wu", 38},  // 直接初始化數(shù)組第1個(gè)元素
        {104, "Zhao Liu", 42}  // 直接初始化數(shù)組第2個(gè)元素
    };


    std::cout << "Hello GCC! 這是C++主程序" << std::endl;  // 控制臺(tái)輸出內(nèi)容
    return 0;  // 程序正常退出(返回0表示成功)
}
  • g++ main.cpp -o test -std=c++03 方式編譯會(huì)報(bào)錯(cuò)
  • g++ main.cpp -o test -std=c++11 方式編譯不會(huì)報(bào)錯(cuò)

三. 容器初始化

vector<int> v; v.push_back(1); v.push_back(2); 繁瑣,不能直接批量賦值;

// C++98 代碼
#include <vector>
using namespace std;

int main() {
    vector<int> v; // 空容器
    v.push_back(1); // 第1個(gè)元素
    v.push_back(2); // 第2個(gè)元素
    v.push_back(3); // 第3個(gè)元素
    // 若要初始化10個(gè)元素,需寫10行push_back,極其冗余
    return 0;
}

C++98 甚至不支持 vector<int> v = {1,2,3}; 這種直觀寫法,唯一的「批量初始化」 workaround 是用數(shù)組臨時(shí)中轉(zhuǎn),但更繁瑣:

// C++98 勉強(qiáng)實(shí)現(xiàn)批量初始化(不推薦)
int temp[] = {1,2,3};
vector<int> v(temp, temp + sizeof(temp)/sizeof(temp[0])); // 借助迭代器范圍

在c++11標(biāo)準(zhǔn)下,支持以下方式:

// C++11 代碼
#include <vector>
#include <map>
#include <list>
using namespace std;

int main() {
    // 1. vector 直接批量初始化(像數(shù)組一樣簡潔)
    vector<int> v{1,2,3,4,5}; // 等價(jià)于 v = {1,2,3,4,5},支持等號(hào)可選
    vector<string> strs{"apple", "banana", "orange"}; // 字符串容器也支持

    // 2. 其他容器同樣支持
    list<int> lst{10,20,30}; // 鏈表
    map<string, int> score{
        {"Zhang", 90},
        {"Li", 85},
        {"Wang", 95} // map 的鍵值對(duì)批量初始化,直觀清晰
    };

    // 3. 嵌套容器初始化(復(fù)雜場景也支持)
    vector<vector<int>> matrix{
        {1,2,3},
        {4,5,6},
        {7,8,9} // 二維vector直接初始化,無需多層push_back
    };

    return 0;
}

代碼可讀性直接拉滿,一眼就能看出容器的初始內(nèi)容,徹底告別冗余的 push_back。

C++11 容器的 {} 初始化會(huì)直接根據(jù) initializer_list 中的元素個(gè)數(shù),一次性分配足夠的內(nèi)存,避免了多次擴(kuò)容和元素拷貝:

  • 比如 vector<int> v{1,2,3,4,5},容器會(huì)先計(jì)算出需要存儲(chǔ) 5 個(gè)元素,直接分配能容納 5 個(gè) int 的內(nèi)存,再把元素拷貝進(jìn)去(僅一次拷貝);
  • 而 C++98 的 push_back 可能需要 2-3 次擴(kuò)容(比如初始容量 1→2→4→8,最后容量 8,浪費(fèi)空間且有多次拷貝)。

四. 窄化轉(zhuǎn)換風(fēng)險(xiǎn)

double x = 3.14; int y = x;(double→int 丟失精度,C++98 僅警告,不報(bào)錯(cuò));

int main() {
    // 測試1:C++98 允許的窄化轉(zhuǎn)換(C++11 {} 禁止)
    int a{3.14}; // 窄化轉(zhuǎn)換:編譯錯(cuò)誤(C++11)

    // 測試2:顯式轉(zhuǎn)換后允許(C++11)
    int b = static_cast<int>(3.14); // 顯式聲明,編譯通過

    cout << "b = " << b << endl;
    return 0;
}
  • g++ main.cpp -o test -std=c++03 編譯只有警告,但是能編譯通過
  • g++ main.cpp -o test -std=c++11 編譯報(bào)錯(cuò)

五. 初始化歧義

vector<int> v(10);(10 個(gè)默認(rèn)值 0)和 vector<int> v{10};(1 個(gè)元素 10),C++98 無區(qū)分方式

僅支持圓括號(hào) () 初始化:vector<int> v(10) 的行為和 C++11 一致(創(chuàng)建 10 個(gè)默認(rèn)值為 0 的元素)

不支持花括號(hào) {} 初始化: vector<int> v{10} 在 C++98 中是 語法錯(cuò)誤,編譯器無法識(shí)別花括號(hào)作為初始化列表的語法。

int main() {
    std::vector<int> v1(10);
    std::cout << "v1 使用 (10) 初始化:" << std::endl;
    std::cout << "  大小: " << v1.size() << std::endl;

    std::vector<int> v2{10};
    std::cout << "v2 使用 {10} 初始化:" << std::endl;
    std::cout << "  大小: " << v2.size() << std::endl;

    
    // C++98 中,圓括號(hào) () 的行為和 C++11 一樣
    // C++98 中,沒有列表初始化語法,花括號(hào) {} 不能這樣用
    // std::vector<int> v98_2{10}; // 編譯錯(cuò)誤!C++98 不認(rèn)識(shí)這種語法。

    return 0;
}
g++ main.cpp -std=c++03

使用c++03編譯的時(shí)候,會(huì)有報(bào)錯(cuò)

root@DFH-X5-243030:/mnt/d/linux_path/study# g++ main.cpp -std=c++03
main.cpp: In function ‘int main()':
main.cpp:15:24: warning: extended initializer lists only available with ‘-std=c++11' or ‘-std=gnu++11' [-Wc++11-extensions]
   15 |     std::vector<int> v2{10};
      |                        ^
main.cpp:15:22: error: in C++98 ‘v2' must be initialized by constructor, not by ‘{...}'
   15 |     std::vector<int> v2{10};
      |                      ^~
root@DFH-X5-243030:/mnt/d/linux_path/study#

使用c++11編譯正常,打印結(jié)果如下:

root@DFH-X5-243030:/mnt/d/linux_path/study# g++ main.cpp -std=c++11
root@DFH-X5-243030:/mnt/d/linux_path/study# ll
total 32
drwxrwxrwx 1 gupan gupan  4096 Nov 21 11:13 ./
drwxrwxrwx 1 gupan gupan  4096 Nov 11 17:35 ../
-rwxrwxrwx 1 gupan gupan 25160 Nov 21 11:13 a.out*
-rwxrwxrwx 1 gupan gupan   803 Nov 21 11:13 main.cpp*
root@DFH-X5-243030:/mnt/d/linux_path/study# ./a.out
v1 使用 (10) 初始化:
  大小: 10
v2 使用 {10} 初始化:
  大小: 1
root@DFH-X5-243030:/mnt/d/linux_path/study#

到此這篇關(guān)于c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c++11 統(tǒng)一初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 中友元函數(shù)與友元類詳解

    C++ 中友元函數(shù)與友元類詳解

    這篇文章主要介紹了C++ 中友元函數(shù)與友元類詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 詳解c++ 靜態(tài)成員變量

    詳解c++ 靜態(tài)成員變量

    這篇文章主要介紹了c++ 靜態(tài)成員變量的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-09-09
  • c++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實(shí)現(xiàn)方法

    c++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猚++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Qt編寫提示進(jìn)度條的實(shí)現(xiàn)示例

    Qt編寫提示進(jìn)度條的實(shí)現(xiàn)示例

    進(jìn)度條在很地方都可以使用到,Qt自帶的進(jìn)度條或者操作系統(tǒng)的進(jìn)度條樣式,不夠炫,本文就介紹一下Qt編寫自定義控件的提示進(jìn)度條的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2021-12-12
  • C語言實(shí)現(xiàn)停車場管理

    C語言實(shí)現(xiàn)停車場管理

    這篇文章主要為大家詳細(xì)介紹了C語言課程設(shè)計(jì)之停車場管理問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)視頻播放與進(jìn)度控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    分水嶺算法是一種常用的圖像區(qū)域分割法,本文主要介紹了OpenCV圖像分割與分水嶺算法,使用C++實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-06-06
  • C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系對(duì)比分析

    C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系對(duì)比分析

    C和C++中數(shù)組大小通常要求是一個(gè)編譯時(shí)常量,C語言中,const變量不能直接作為數(shù)組大小,需要使用#define或enum,C++中,const變量被視為常量表達(dá)式,可以作為數(shù)組大小,本文介紹C?與?C++?中的?const?常量與數(shù)組大小的關(guān)系,感興趣的朋友一起看看吧
    2025-02-02
  • C++中virtual繼承的深入理解

    C++中virtual繼承的深入理解

    本篇文章是對(duì)C++中的virtual繼承進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    鏈表是一種動(dòng)態(tài)分配空間的存儲(chǔ)結(jié)構(gòu),能更有效地利用存儲(chǔ)空間,通過對(duì)單鏈表基本操作的代碼實(shí)現(xiàn),我深刻領(lǐng)悟到以“指針”指示元素的后繼,在插入或刪除元素時(shí)不需要移動(dòng)元素
    2023-07-07

最新評(píng)論

平舆县| 枣庄市| 义乌市| 顺平县| 绥芬河市| 湘潭市| 桂阳县| 原阳县| 奉节县| 北票市| 曲水县| 商水县| 金寨县| 庆城县| 洪雅县| 白银市| 镇平县| 清河县| 普陀区| 安徽省| 南漳县| 井陉县| 调兵山市| 光山县| 高青县| 信阳市| 江津市| 武威市| 靖宇县| 和政县| 南投市| 崇礼县| 华亭县| 米易县| 丽水市| 哈巴河县| 涟水县| 年辖:市辖区| 茶陵县| 宜州市| 宁阳县|