自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++11 統(tǒng)一初始化:一個特性,兩種命運(yùn),無數(shù)開發(fā)者的困惑

開發(fā)
想象一下,如果一個學(xué)校里每個班級的學(xué)生都穿不同的衣服,看起來會很混亂對吧? C++在C++11之前的初始化方式就像這樣 - 五花八門,讓人眼花繚亂!

想象一下,如果一個學(xué)校里每個班級的學(xué)生都穿不同的衣服,看起來會很混亂對吧? C++在C++11之前的初始化方式就像這樣 - 五花八門,讓人眼花繚亂! 

傳統(tǒng)初始化方式 - 混亂的"私服時代" 

在介紹統(tǒng)一初始化之前,讓我們先回顧一下傳統(tǒng)的初始化方式有多混亂 

// 傳統(tǒng)初始化方式大觀園 ??
int a = 1;                    // 復(fù)制初始化 ?? - 像復(fù)印一樣簡單
                             // 最常見但可能有性能開銷 ??

int b(2);                     // 直接初始化 ?? - 直接命中目標(biāo)
                             // 性能較好但寫法不夠直觀 ??

int arr[] = {1, 2, 3};       // 數(shù)組聚合初始化 ?? - 把值打包在一起
                             // 只能用于簡單數(shù)據(jù)類型和POD類型 ??

std::vector<int> v(3, 1);    // 容器構(gòu)造初始化 ??? - 建造者模式
                             // 創(chuàng)建包含3個值為1的元素 ??
                             // 但這種語法容易與函數(shù)聲明混淆 ??

// 每種初始化方式都像是不同風(fēng)格的衣服 ??????
// 雖然都能穿,但看起來不夠統(tǒng)一!

就像每個學(xué)生穿自己喜歡的衣服上學(xué),雖然也能用,但看著就很亂! 這些不同的初始化方式各有特點(diǎn),但缺乏一致性,增加了學(xué)習(xí)和使用的難度,正是這種混亂促使了C++11引入統(tǒng)一初始化語法。

C++11統(tǒng)一初始化 - 優(yōu)雅的"制服時代" 

// ?? 統(tǒng)一使用花括號{}初始化 - 就像所有學(xué)生都穿上了同樣的校服

// 基礎(chǔ)類型初始化 ??
int a{1};                   // 像是給新生發(fā)的第一件校服
double d{3.14};            // ?? 精確數(shù)值的初始化

// 數(shù)組初始化 ??
int arr[]{1, 2, 3};        // 就像排隊的學(xué)生們,整整齊齊站成一排
char str[]{"Hello"};       // ?? 字符數(shù)組也可以這樣初始化

// 容器初始化 ??
std::vector<int> v{3, 1};  // 像是把學(xué)生分到不同的班級里
std::array<int, 3> arr{1, 2, 3};  // ?? 固定大小數(shù)組的初始化

// 自定義類型初始化 ???
struct Point {
    int x;
    int y;
};
Point p{10, 20};           // ?? 結(jié)構(gòu)體成員一目了然

// 嵌套初始化 ??
std::vector<Point> points{ // ?? 復(fù)雜數(shù)據(jù)結(jié)構(gòu)的優(yōu)雅初始化
    {1, 2},
    {3, 4},
    {5, 6}
};

?? 簡要總結(jié): 統(tǒng)一初始化就像是給所有變量都穿上了統(tǒng)一的"校服",不管是基本類型、數(shù)組還是復(fù)雜容器,都可以用花括號{}來初始化。這種方式不僅讓代碼更整潔,還提供了類型安全檢查,防止意外的數(shù)據(jù)丟失。記?。航y(tǒng)一初始化是現(xiàn)代C++編程的推薦實(shí)踐!

好處:

  • 語法統(tǒng)一 - 到處都能用相同的{}形式
  • 更安全 - 能防止意外的類型轉(zhuǎn)換
  • 更直觀 - 一眼就能看出是在初始化
  • 更靈活 - 適用于各種數(shù)據(jù)類型

統(tǒng)一初始化的"安全帶" 

統(tǒng)一初始化不僅讓代碼更整潔,還自帶"安全帶"功能:

// ?? 更多安全檢查的實(shí)戰(zhàn)示例
struct Point {
    int x, y;
};

// ?? 以下初始化都會在編譯時報錯
longlong bigNum{3.14};        // ? 浮點(diǎn)數(shù)到整數(shù)的精度丟失
char ch{500};                  // ? 超出char范圍的數(shù)值
Point p{1, 2, 3};             // ? 參數(shù)過多
std::vector<int> v{10.5};     // ? 容器元素類型不匹配

// ? 正確的初始化方式
longlong safeNum{314};        // 整數(shù)初始化沒問題
char safeCh{'A'};             // 字符范圍內(nèi)的值
Point safeP{1, 2};            // 參數(shù)個數(shù)匹配
std::vector<int> safeV{10};   // 元素類型匹配

要點(diǎn)總結(jié):

  • 統(tǒng)一初始化就像編譯時的安全檢查員
  • 防止有損的類型轉(zhuǎn)換
  • 阻止數(shù)組越界初始化
  • 確保類型匹配和參數(shù)正確
  • 幫助寫出更健壯的代碼

記?。簩幙稍诰幾g時發(fā)現(xiàn)錯誤,也不要在運(yùn)行時遇到意外!

聰明但有點(diǎn)"任性"的特性

不過要注意,統(tǒng)一初始化有時候會像個"任性的孩子",特別是遇到std::initializer_list的時候:

class MagicBox {
public:
    // ?? 普通的禮盒包裝 - 接受兩個簡單的數(shù)字
    MagicBox(int x, int y) {}                         

    // ?? 特殊的禮盒包裝 - 可以裝入任意數(shù)量的數(shù)字
    // ?? 當(dāng)遇到{}初始化時,這個構(gòu)造函數(shù)會被優(yōu)先選擇!
    MagicBox(std::initializer_list<int> list) {}      
};

// ?? 兩種不同的初始化方式
MagicBox box1(10, 20);      // ? 乖乖調(diào)用普通構(gòu)造函數(shù)
                           // ?? 明確指定使用兩個參數(shù)的構(gòu)造函數(shù)

MagicBox box2{10, 20};      // ?? 調(diào)皮地選擇了列表構(gòu)造函數(shù) 
                           // ?? 注意:這里的{10, 20}會被當(dāng)作initializer_list
                           // ?? 可能不是你想要的行為!

// ?? 更多關(guān)于initializer_list的示例
class SmartBox {
public:
    // ?? 多個構(gòu)造函數(shù)的情況
    SmartBox(int x) { }                              // ?? 單參數(shù)構(gòu)造函數(shù)
    SmartBox(std::initializer_list<int> list) { }    // ?? 列表構(gòu)造函數(shù)
    SmartBox(int x, int y, int z) { }               // ?? 三參數(shù)構(gòu)造函數(shù)

    // ?? 下面的初始化會調(diào)用哪個構(gòu)造函數(shù)呢?
    // SmartBox b1{1};        // ?? 調(diào)用initializer_list構(gòu)造函數(shù)
    // SmartBox b2(1);        // ?? 調(diào)用單參數(shù)構(gòu)造函數(shù)
    // SmartBox b3{1,2,3};    // ?? 調(diào)用initializer_list構(gòu)造函數(shù)
    // SmartBox b4(1,2,3);    // ?? 調(diào)用三參數(shù)構(gòu)造函數(shù)
};

要點(diǎn)提示:

  • 當(dāng)類同時具有普通構(gòu)造函數(shù)和initializer_list構(gòu)造函數(shù)時
  • 使用{}初始化會優(yōu)先選擇initializer_list構(gòu)造函數(shù)
  • 使用()初始化則會選擇最匹配的普通構(gòu)造函數(shù)
  • 這種行為可能導(dǎo)致意想不到的結(jié)果,需要特別注意!

最佳實(shí)踐:

  • 如果想明確調(diào)用普通構(gòu)造函數(shù),使用()
  • 如果需要列表初始化的語義,使用{}
  • 在設(shè)計類時要慎重考慮是否提供initializer_list構(gòu)造函數(shù)

使用建議

統(tǒng)一初始化就像一件好工具:

  • 需要安全檢查時,用它!
  • 想要代碼整潔時,用它!
  • 但遇到initializer_list時要小心
  • 不要盲目使用,要根據(jù)具體場景選擇

記住:統(tǒng)一初始化是個好幫手,但不是萬能藥。用對了它,代碼會更清晰、更安全! 

統(tǒng)一初始化與類成員

類成員的統(tǒng)一初始化讓我們能夠以一種清晰直觀的方式為類成員設(shè)置默認(rèn)值,就像給新生入學(xué)時發(fā)放標(biāo)準(zhǔn)裝備一樣! 

class Student {
    // ??? 成員變量的默認(rèn)初始化
    std::string name{"未命名"};   // ?? 如果沒有特別指定,學(xué)生就叫"未命名"
    int age{18};                  // ?? 默認(rèn)年齡設(shè)為18歲
    std::vector<int> scores{};    // ?? 創(chuàng)建一個空的成績列表
    double gpa{0.0};              // ?? 初始GPA設(shè)為0.0
    bool isActive{true};          // ? 默認(rèn)為在校生
    std::vector<std::string> courses{}; // ?? 空的課程列表
};

// ???? 老師類展示了在構(gòu)造函數(shù)初始化列表中使用統(tǒng)一初始化
class Teacher {
public:
    // ?? 構(gòu)造函數(shù)使用初始化列表
    Teacher(std::string teacherName = "張老師") : 
        name{teacherName},   // ?? 可自定義老師姓名
        subject{"數(shù)學(xué)"},     // ?? 默認(rèn)教授學(xué)科
        years{0},           // ? 教齡從0開始
        classes{}           // ?? 初始化空的班級列表
    {} 
    
    // ?? 添加一個班級
    void addClass(const std::string& className) {
        classes.push_back(className);
    }
    
private:
    std::string name;                    // ?? 老師姓名
    std::string subject;                 // ?? 教授科目
    int years;                          // ??? 教齡年數(shù)
    std::vector<std::string> classes;    // ?? 負(fù)責(zé)的班級列表
};

// ?? 使用示例:
// Student student;                      // ? 會使用上面定義的所有默認(rèn)值
// Teacher mathTeacher{"李老師"};        // ? 創(chuàng)建一個指定姓名的老師
// Teacher defaultTeacher;              // ? 創(chuàng)建默認(rèn)的張老師

要點(diǎn)總結(jié):

  • 成員變量可以直接在聲明時使用{}進(jìn)行初始化
  • 構(gòu)造函數(shù)初始化列表也可以使用統(tǒng)一初始化語法
  • 這種方式讓代碼更加清晰,減少了初始化相關(guān)的錯誤
  • 特別適合設(shè)置類成員的默認(rèn)值

記?。航y(tǒng)一初始化就像給類的每個成員都準(zhǔn)備了一份"入職裝備",讓對象一創(chuàng)建就處于正確的初始狀態(tài)! 

常見應(yīng)用場景

// 1. 動態(tài)分配對象 ??
auto ptr = new Student{"小明", 16};  // ?? 在堆上創(chuàng)建學(xué)生對象
                                    // ?? 使用花括號可以直觀地傳遞構(gòu)造參數(shù)

// 2. 返回值初始化 ??
std::vector<int> getNumbers() {
    return {1, 2, 3, 4, 5};  // ? 簡潔優(yōu)雅的返回方式
                            // ?? 自動構(gòu)造并返回臨時vector對象
}

// 3. 復(fù)雜數(shù)據(jù)結(jié)構(gòu)初始化 ??
std::map<std::string, std::vector<int>> scores{
    {"小明", {90, 95, 88}},  // ?? 嵌套的統(tǒng)一初始化
    {"小紅", {92, 96, 93}}   // ?? 直觀地構(gòu)建復(fù)雜數(shù)據(jù)結(jié)構(gòu)
};                          // ??? 一目了然的成績單格式

初始化陷阱大揭秘 - 當(dāng)心這些小坑! 

(1) 空大括號的小把戲

std::vector<int> v1();    // ?? 哎呀!這不是空vector,這是在聲明函數(shù)啦!
std::vector<int> v2{};    // ? 這才是真正的空vector,記住用{}哦

就像魔術(shù)師的障眼法一樣,()和{}看起來都像在創(chuàng)建空vector,但實(shí)際效果可大不同! ???

(2) 構(gòu)造函數(shù)的"選美比賽" ??

class Widget {
public:
    Widget(int i, bool b) {}                    // ?? 普通構(gòu)造函數(shù)
    Widget(std::initializer_list<bool> il) {}   // ?? "明星"構(gòu)造函數(shù)
};

當(dāng)你這樣寫的時候:

Widget w1(10, true);   // ?? 乖乖走普通構(gòu)造
Widget w2{10, true};   // ?? 咦?跑去調(diào)用initializer_list構(gòu)造了!

就像選美比賽一樣,initializer_list構(gòu)造函數(shù)總是想出風(fēng)頭,看到{}就會搶著上! ??♀???

(3) 防坑小貼士

  • 創(chuàng)建空容器?記得用{}!
  • 遇到initializer_list要特別小心
  • 不確定用什么?()更保險!

記住這些,就能避免掉進(jìn)初始化的"陷阱"啦! 開心編碼,不踩坑! 

優(yōu)秀實(shí)踐建議

  • 優(yōu)先使用花括號初始化來防止意外的類型轉(zhuǎn)換
  • 對于內(nèi)置類型,三種形式(=、()、{})都可以,但建議保持一致性
  • 如果類有std::initializer_list構(gòu)造函數(shù),要特別注意使用()還是{}
  • 在模板編程中要特別小心初始化語法的選擇
責(zé)任編輯:趙寧寧 來源: everystep
相關(guān)推薦

2013-07-29 11:11:33

C++C++11

2011-03-16 15:58:27

Windows AzuAzure Stora

2024-08-08 16:34:16

C++11編程

2014-04-17 10:42:50

DevOps

2015-06-05 09:15:37

移動開發(fā)者

2013-05-03 10:26:14

iOS開發(fā)游戲開發(fā)

2010-12-21 10:00:23

Web開發(fā)

2014-06-18 09:55:29

iOS開發(fā)者學(xué)習(xí)Android

2009-08-28 11:24:48

C#一維數(shù)組初始化

2019-04-16 09:00:05

AndroidKotlinJava

2023-10-06 20:57:52

C++聚合成員

2010-08-24 08:58:42

開發(fā)者

2015-08-06 17:15:28

2012-10-23 14:01:21

Yibo 客戶端已經(jīng)停

2013-02-20 15:10:56

2009-09-11 08:44:36

2019-05-24 09:04:31

C++編程語言開發(fā)

2015-05-15 10:19:17

AndroidROM碎片化

2015-09-01 09:53:04

Java Web開發(fā)者

2016-01-05 13:43:37

谷歌Java競爭
點(diǎn)贊
收藏

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