成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼太臃腫?這個(gè) C++11 特性幫你減肥!

開(kāi)發(fā)
還記得在 C++11 之前,初始化變量時(shí)那些讓人頭疼的場(chǎng)景嗎?讓我們來(lái)看看這個(gè)進(jìn)化史!

記得在 C++11 之前,初始化變量時(shí)那些讓人頭疼的場(chǎng)景嗎?讓我們來(lái)看看這個(gè)進(jìn)化史!

從前從前... 

讓我們看看 C++11 之前那些繁瑣的初始化方式:

// 基礎(chǔ)類(lèi)型還算簡(jiǎn)單 ?
int x = 42;                        
double pi = 3.14159;               

這看起來(lái)還不錯(cuò),對(duì)吧?但是當(dāng)我們處理容器類(lèi)型時(shí),情況就變得糟糕了:

// 向量初始化 - 好痛苦!??
std::vector<int> v;                
v.push_back(1);                    // 一個(gè)接一個(gè)地添加...
v.push_back(2);                    // 寫(xiě)得手都酸了
v.push_back(3);                    // 還沒(méi)完嗎?

map 類(lèi)型的初始化更是讓人頭大:

// map 初始化 - 更麻煩了!??
std::map<std::string, int> scores; 
scores["張三"] = 95;               // 一個(gè)一個(gè)插入
scores["李四"] = 87;               // 繼續(xù)插入...

奇怪的是,數(shù)組倒是可以用花括號(hào),這不公平!

// 為什么只有數(shù)組可以這樣???
int arr[] = {1, 2, 3};          

這些初始化方式存在以下問(wèn)題:

  • 語(yǔ)法不統(tǒng)一:為什么數(shù)組可以用 {},其他類(lèi)型卻不行?
  • 代碼冗長(zhǎng):需要寫(xiě)很多行才能完成初始化
  • 容易出錯(cuò):多次操作增加了出錯(cuò)機(jī)會(huì)
  • 效率低下:對(duì)于容器,需要多次調(diào)用方法

驚喜來(lái)了!C++11 的列表初始化

讓我們一步步看看這個(gè)優(yōu)雅的語(yǔ)法:

// 基礎(chǔ)類(lèi)型變得更整潔了! ?
int x{42};                         // 再見(jiàn)了,等號(hào)!

對(duì)于容器類(lèi)型,再也不用寫(xiě)一堆 push_back 了:

// 向量初始化變得超簡(jiǎn)單! ??
std::vector<int> v{1, 2, 3};      // 一行代碼搞定,清爽!

// map 也能輕松搞定! ??
std::map<std::string, int> scores{
    {"張三", 95},                 // 鍵值對(duì)直觀(guān)明了
    {"李四", 87}                  // 再也不用 scores["xxx"] = yyy
};

最令人興奮的是復(fù)雜結(jié)構(gòu)體的初始化:

// 結(jié)構(gòu)體也能優(yōu)雅初始化! ??
struct Student {
    std::string name;
    int age;
    std::vector<std::string> hobbies;
};

// 看看這清晰的層次感! ??
Student xiaoming{
    "小明",                       // 名字一目了然
    16,                           // 年齡清清楚楚
    {"編程", "打游戲", "看動(dòng)漫"}  // 愛(ài)好一目了然,還支持嵌套! ??
};

每個(gè)例子都展示了列表初始化的不同應(yīng)用場(chǎng)景,從簡(jiǎn)單到復(fù)雜,都能完美駕馭!

安全護(hù)航 - 你的類(lèi)型轉(zhuǎn)換守護(hù)者

列表初始化就像一個(gè)盡職的安全衛(wèi)士,它會(huì)嚴(yán)格檢查所有的類(lèi)型轉(zhuǎn)換。讓我們看看它是如何保護(hù)我們的代碼的:

// 傳統(tǒng)初始化方式 - 危險(xiǎn)的靜默轉(zhuǎn)換 ??
int x = 3.14;    // 糟糕!悄悄把 3.14 截?cái)喑闪?3
                 // 編譯器完全不會(huì)警告你 ??

這種靜默的數(shù)據(jù)丟失非常危險(xiǎn)!再看看列表初始化如何處理:


// 列表初始化 - 嚴(yán)格的安全檢查 ??
int y{3.14};     // 編譯器立即報(bào)錯(cuò): "narrowing conversion" ?
                 // 防止你犯下可能導(dǎo)致數(shù)據(jù)丟失的錯(cuò)誤 

不僅如此,它還能保護(hù)我們免受其他類(lèi)型的危險(xiǎn)轉(zhuǎn)換:

// 更多安全檢查示例 ??
long long big{10000000000};  // OK ? - 數(shù)值在 long long 范圍內(nèi)
int small{big};             // 錯(cuò)誤! ? - 可能的數(shù)據(jù)丟失
bool flag{5};               // 錯(cuò)誤! ? - 不允許隱式轉(zhuǎn)換為布爾值

就像是代碼世界的保安:

  • 檢查每一次類(lèi)型轉(zhuǎn)換
  • 及時(shí)發(fā)現(xiàn)潛在問(wèn)題
  • 在編譯時(shí)就幫你攔住錯(cuò)誤 

實(shí)用小技巧

讓我們看看列表初始化的一些巧妙用法!

// 返回值也能用列表初始化,告別臨時(shí)變量! ??
auto getMagicNumbers() {
    return std::vector<int>{1, 2, 3, 4, 5};  // 直接返回,簡(jiǎn)潔優(yōu)雅 ?
}

函數(shù)參數(shù)也能玩出新花樣:

// 使用 initializer_list 讓參數(shù)傳遞更靈活 ??
void printList(std::initializer_list<std::string> items) {
    for (const auto& item : items) {
        std::cout << item << "?";  // 給每個(gè)元素加點(diǎn)閃光 ?
    }
}

// 調(diào)用時(shí)簡(jiǎn)單直觀(guān),不需要先創(chuàng)建容器
printList({"蘋(píng)果", "香蕉", "橙子"});  // 水果清單一目了然 ??????

自定義類(lèi)也能輕松支持列表初始化:

class WishList {
public:
    // 為你的類(lèi)添加列表初始化支持 ??
    WishList(std::initializer_list<std::string> wishes) {
        // 在這里實(shí)現(xiàn)愿望清單的處理邏輯...
    }
};

// 創(chuàng)建對(duì)象時(shí)更加優(yōu)雅自然
WishList myWishes{
    "環(huán)游世界",   // 遠(yuǎn)大夢(mèng)想 ??
    "學(xué)會(huì)跳舞",   // 生活情趣 ??
    "寫(xiě)好代碼"    // 技能提升 ??
};

每個(gè)例子都展示了列表初始化的強(qiáng)大功能,讓我們的代碼更加簡(jiǎn)潔優(yōu)雅!

為什么要用列表初始化? 

統(tǒng)一的語(yǔ)法:

  • 所有類(lèi)型都用 {},不用記憶不同的初始化方式
  • 代碼更整潔,可讀性更好

更安全:

  • 防止意外的類(lèi)型轉(zhuǎn)換
  • 編譯時(shí)就能發(fā)現(xiàn)潛在問(wèn)題

更方便:

  • 一行代碼完成復(fù)雜初始化
  • 特別適合容器類(lèi)型

小貼士

  • 空的 {} 會(huì)初始化為默認(rèn)值
  • 可以和 auto 完美配合
  • 標(biāo)準(zhǔn)庫(kù)容器都支持列表初始化
  • 自定義類(lèi)通過(guò) initializer_list 即可支持列表初始化

記住:列表初始化就像是給變量送上一份精心包裝的禮物,既漂亮又安全,何樂(lè)而不為呢?

深入理解 std::initializer_list 

(1) 為什么需要 initializer_list? 

在介紹具體用法之前,讓我們先理解為什么需要 std::initializer_list:

  • 統(tǒng)一初始化語(yǔ)法的基石
// 在 C++11 之前,不同容器有不同的初始化方式
std::vector<int> v1;          // 默認(rèn)構(gòu)造
std::vector<int> v2(3, 1);    // 構(gòu)造函數(shù)
v1.push_back(1);              // 單個(gè)添加元素

// 有了 initializer_list,所有容器都能統(tǒng)一使用 {} 語(yǔ)法
std::vector<int> v3{1, 2, 3}; // 優(yōu)雅!
std::list<int> l{1, 2, 3};    // 同樣的語(yǔ)法!
std::set<int> s{1, 2, 3};     // 到處都能用!
  • 解決可變參數(shù)傳遞的問(wèn)題
// 傳統(tǒng)方式處理可變數(shù)量參數(shù)很麻煩
void oldWay(int count, ...) {  // C風(fēng)格可變參數(shù),類(lèi)型不安全
    // 復(fù)雜的參數(shù)解析...
}

// 使用 initializer_list 優(yōu)雅處理
void newWay(std::initializer_list<int> nums) {  // 類(lèi)型安全、使用簡(jiǎn)單
    for (int num : nums) {
        // 處理每個(gè)參數(shù)...
    }
}

// 調(diào)用時(shí)非常直觀(guān)
newWay({1, 2, 3, 4, 5});  // 想傳幾個(gè)參數(shù)都可以
  • 自定義類(lèi)型的初始化支持
class MyContainer {
public:
    // 沒(méi)有 initializer_list 時(shí),需要寫(xiě)多個(gè)構(gòu)造函數(shù)
    MyContainer(int a) { /* ... */ }
    MyContainer(int a, int b) { /* ... */ }
    MyContainer(int a, int b, int c) { /* ... */ }  // 好煩!

    // 有了 initializer_list,一個(gè)構(gòu)造函數(shù)搞定所有情況
    MyContainer(std::initializer_list<int> values) {
        // 統(tǒng)一處理任意數(shù)量的初始值
    }
};

// 使用時(shí)非常靈活
MyContainer c1{1};         // OK
MyContainer c2{1, 2};      // OK
MyContainer c3{1, 2, 3};   // 還是 OK!

簡(jiǎn)而言之,initializer_list 解決了以下核心問(wèn)題:

  • 提供了統(tǒng)一的初始化語(yǔ)法
  • 支持類(lèi)型安全的可變參數(shù)傳遞
  • 簡(jiǎn)化了容器和自定義類(lèi)型的初始化
  • 讓代碼更加簡(jiǎn)潔優(yōu)雅

讓我們深入了解這個(gè)強(qiáng)大的工具!

(2) initializer_list 的特性

  • 只讀特性 ?? 讓我們先看看 initializer_list 最基本的特性 - 它是只讀的!
void processItems(std::initializer_list<int> items) {
    // items[0] = 42;  // ? 糟糕!不能修改元素
                       // initializer_list 就像一個(gè)保護(hù)罩,防止意外修改數(shù)據(jù)
    
    // ? 正確的使用方式:只讀遍歷
    for (const auto& item : items) {  
        std::cout << item << " ";  // 只能讀取,不能修改
    }
}
  • 輕量級(jí)設(shè)計(jì) ?? initializer_list 的設(shè)計(jì)非常巧妙,它并不會(huì)復(fù)制元素!
// ?? 內(nèi)部實(shí)現(xiàn)非常簡(jiǎn)單,只需要兩個(gè)指針:
// - 一個(gè)指向數(shù)據(jù)的起始位置
// - 一個(gè)表示數(shù)據(jù)的長(zhǎng)度
void example() {
    std::initializer_list<int> list = {1, 2, 3};  // 不會(huì)復(fù)制這些數(shù)字!
    
    // 提供了簡(jiǎn)單但夠用的接口
    std::cout << "元素個(gè)數(shù): " << list.size() << std::endl;  // 獲取大小 ??
    
    // 支持迭代器操作 ??
    auto begin = list.begin();  // 開(kāi)始位置
    auto end = list.end();      // 結(jié)束位置
}
  • 靈活的重載 ?? 看看 initializer_list 如何讓構(gòu)造函數(shù)變得更智能:
class SmartContainer {
public:
    // ?? 普通構(gòu)造函數(shù) - 只接受一個(gè)大小參數(shù)
    SmartContainer(int size) { 
        std::cout << "調(diào)用普通構(gòu)造函數(shù)" << std::endl;
    }
    
    // ?? initializer_list 構(gòu)造函數(shù) - 可以接受任意數(shù)量的值
    SmartContainer(std::initializer_list<int> items) {
        std::cout << "調(diào)用 initializer_list 構(gòu)造函數(shù)" << std::endl;
    }
};

// 看看編譯器如何智能地選擇構(gòu)造函數(shù) ??
void demo() {
    SmartContainer c1(10);           // ?? 使用普通構(gòu)造函數(shù)
    SmartContainer c2{10};           // ?? 使用 initializer_list 構(gòu)造函數(shù)
    SmartContainer c3{1, 2, 3, 4};   // ?? 使用 initializer_list 構(gòu)造函數(shù)
}

實(shí)用技巧與注意事項(xiàng)

  • 配合模板使用
// ?? 通用打印函數(shù),可以處理任何類(lèi)型的列表
template<typename T>
void printAll(std::initializer_list<T> items) {
    for (const auto& item : items) {
        std::cout << item << " ";  // ??? 逐個(gè)打印元素
    }
}

// ?? 看看它有多靈活!
printAll({1, 2, 3});           // ?? 處理數(shù)字
printAll({"貓", "狗", "兔"});   // ?? 處理字符串
  • 性能優(yōu)化小技巧
class OptimizedContainer {
private:
    std::vector<int> data;
    
public:
    // ? 優(yōu)化的構(gòu)造函數(shù)
    OptimizedContainer(std::initializer_list<int> items) {
        data.reserve(items.size());  // ?? 提前分配空間,避免頻繁重新分配
        data = items;                // ?? 一次性復(fù)制所有數(shù)據(jù)
    }
};
  • 需要注意的陷阱
void potential_problem() {
    // ? 這樣是安全的
    auto list = {1, 2, 3};  
    
    // ?? 危險(xiǎn)操作!
    auto ptr = list.begin();
    // ? 不要在 initializer_list 銷(xiāo)毀后使用其迭代器
    // ?? ptr 可能指向已經(jīng)被釋放的內(nèi)存
}

使用建議

  • 優(yōu)先使用 initializer_list 接收同類(lèi)型的多個(gè)參數(shù)
  • 記住它是只讀的,不要嘗試修改元素
  • 注意生命周期,不要保存其迭代器
  • 在自定義容器類(lèi)中支持列表初始化
責(zé)任編輯:趙寧寧 來(lái)源: everystep
相關(guān)推薦

2022-08-01 08:48:39

Go代碼接口

2012-12-25 10:52:23

IBMdW

2013-12-11 10:00:14

C++新特性C

2025-01-22 14:00:00

C++11委托構(gòu)造函數(shù)代碼

2024-12-27 09:12:12

C++17代碼元組

2025-06-23 02:00:00

2020-07-27 10:40:35

C++11語(yǔ)言代碼

2020-06-01 21:07:33

C11C++11內(nèi)存

2013-07-29 11:11:33

C++C++11

2024-02-01 13:05:00

C++11C++編程

2013-05-30 00:49:36

C++11C++條件變量

2024-05-29 13:21:21

2021-01-24 11:59:48

開(kāi)源技術(shù) 工具

2013-11-29 09:51:26

C++雙重檢查鎖定

2013-09-25 14:20:46

2024-02-21 23:43:11

C++11C++開(kāi)發(fā)

2013-12-23 09:48:43

C++鎖定模式

2011-10-13 10:21:01

C++

2009-08-14 10:51:43

2021-07-09 05:59:03

Windows 11操作系統(tǒng)WhyNotWin11
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产在线观看 | 国产精品1区| 日本不卡免费新一二三区 | 国产黄色网址在线观看 | 久久国产欧美日韩精品 | 五月婷婷丁香 | 亚洲精品区 | 99久久婷婷国产综合精品电影 | 国产日韩在线观看一区 | 99这里只有精品 | 日韩精品免费看 | 久久久人成影片一区二区三区 | 亚洲精品大片 | 国产aⅴ爽av久久久久久久 | 亚洲成人网在线 | 国产精品国产a级 | 国产日韩精品一区 | 老司机成人在线 | 四虎影院在线免费观看 | 久久久久久国产精品久久 | 奇米影视在线 | 超碰在线97国产 | 殴美黄色录像 | 欧美亚洲国产日韩 | 精品一区av | 国产成人网 | 亚洲超碰在线观看 | 一区二区三区国产好的精 | 国产亚洲一区二区精品 | 久久精品欧美一区二区三区不卡 | 亚洲视频一区在线 | 日韩成人免费视频 | 欧美一区二区在线播放 | 狠狠色狠狠色综合系列 | 欧洲色综合 | 国产精品成人一区二区 | 中文字幕在线观看 | 亚洲乱码一区二区三区在线观看 | 欧美理论片在线观看 | www.男人天堂.com | 在线亚洲免费视频 |