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

最強(qiáng)干貨:花括號(hào)大法好!一文帶你玩轉(zhuǎn) C++ 所有初始化技巧!

開發(fā)
今天我就用最接地氣的方式,帶你一次性搞懂 C++ 的各種初始化方式,保證你看完就秒懂!

今天咱們來聊一個(gè)看似簡(jiǎn)單實(shí)則暗藏玄機(jī)的話題:C++ 中的初始化。別急著翻白眼,我知道你在想什么——"這不就是給變量賦個(gè)初值嘛,有啥好講的?"

那你可就大錯(cuò)特錯(cuò)啦!C++的初始化方式比你想象的要復(fù)雜得多,而且選錯(cuò)了初始化方式,沒準(zhǔn)哪天就在項(xiàng)目里"炸"了個(gè)莫名其妙的 bug!

今天我就用最接地氣的方式,帶你一次性搞懂 C++ 的各種初始化方式,保證你看完就秒懂!

一、C++初始化的江湖恩怨

在 C++ 這個(gè)"語法帝國"里,初始化可以說是最讓人頭大的事情之一。為啥呢?因?yàn)?C++ 為了照顧各路"客戶"(不同的編程風(fēng)格和需求),提供了 N 種初始化方式,搞得人眼花繚亂。

我們來想象一下,如果把變量比作你的寵物,那初始化就相當(dāng)于給它準(zhǔn)備一個(gè)合適的"家"。下面咱們就來看看 C++ 提供的各種"安家"方式!

二、傳統(tǒng)賦值式初始化(爺爺輩的方式)

int a = 10;
double b = 3.14;
std::string name = "張三";

這是最常見、最古老的方式,從 C 語言那個(gè)年代就有了。就像老一輩安家,簡(jiǎn)單直接,沒那么多花里胡哨。

特點(diǎn):簡(jiǎn)單直觀,人見人愛。

缺點(diǎn):有些情況下會(huì)發(fā)生隱式類型轉(zhuǎn)換,可能導(dǎo)致精度丟失或性能損失。

int x = 3.14;  // 小數(shù)點(diǎn)后的數(shù)據(jù)就這么無情地被砍掉了,x = 3

三、構(gòu)造函數(shù)初始化(正經(jīng)人的選擇)

int a(10);
double b(3.14);
std::string name("張三");

這種方式使用的是圓括號(hào),看起來像是在調(diào)用構(gòu)造函數(shù)。

特點(diǎn):語義更明確,表示"我要用這個(gè)值構(gòu)造一個(gè)對(duì)象"。

缺點(diǎn):有個(gè)著名的"最令人討厭的解析"(Most Vexing Parse)問題:

std::vector<int> numbers(10, 20);  // 創(chuàng)建10個(gè)元素,每個(gè)都是20
std::ifstream reader(filename);    // 沒問題

// 但是這個(gè)就有問題了
std::mutex m();  // 你以為是創(chuàng)建了一個(gè)互斥量?錯(cuò)!這被編譯器理解為函數(shù)聲明!

「補(bǔ)充」什么是Most Vexing Parse?

最令人討厭的解析是 C++ 語法的一個(gè)坑,簡(jiǎn)單說就是:當(dāng)你寫 Type obj(); 時(shí),編譯器不會(huì)把它理解成"創(chuàng)建一個(gè) Type 類型的對(duì)象",而是把它當(dāng)作"聲明了一個(gè)名為 obj 的函數(shù),這個(gè)函數(shù)沒有參數(shù),返回 Type 類型"。

舉個(gè)生活化的例子:你想點(diǎn)一杯奶茶( ),但服務(wù)員理解成你想咨詢一下奶茶的做法,而不是真的給你一杯。這就是為什么用花括號(hào)初始化std::mutex m{};會(huì)更安全,因?yàn)榛ɡㄌ?hào)不會(huì)導(dǎo)致這種誤解。

四、花括號(hào)初始化大家族(C++11的現(xiàn)代方式)

C++11 引入了花括號(hào)初始化,這可以說是一場(chǎng)初始化領(lǐng)域的革命!它統(tǒng)一了各種類型的初始化方式,所以也被稱為"統(tǒng)一初始化"(Uniform Initialization)。

1. 基本的花括號(hào)初始化

int a{10};
double b{3.14};
std::string name{"張三"};

// 也可以寫成這樣
int a = {10};
double b = {3.14};
std::string name = {"張三"};

特點(diǎn):

  • 可以用于任何類型
  • 防止隱式窄化轉(zhuǎn)換(這點(diǎn)非常重要!)
  • 解決了最令人討厭的解析問題
int x{3.14};  // 錯(cuò)誤!編譯器會(huì)報(bào)錯(cuò),因?yàn)閺膁ouble到int是窄化轉(zhuǎn)換
std::mutex m{};  // 絕對(duì)是創(chuàng)建互斥量,不可能被誤解為函數(shù)聲明

2. 零初始化(懶人必備)

花括號(hào)的一個(gè)特殊用法是空花括號(hào)初始化,也就是零初始化:

int a{};     // a = 0
double b{};  // b = 0.0
bool flag{}; // flag = false
char c{};    // c = '\0'

不給值,就用空花括號(hào),這會(huì)將變量初始化為該類型的"零值"。

特點(diǎn):簡(jiǎn)潔,安全,不會(huì)留下未初始化的垃圾值。這比不初始化或者手動(dòng)寫= 0更優(yōu)雅!

3. 用于容器的列表初始化

花括號(hào)語法在容器類型上大放異彩,讓代碼變得簡(jiǎn)潔優(yōu)雅:

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::map<std::string, int> ages = {{"張三", 18}, {"李四", 20}};
std::array<int, 3> arr = {1, 2, 3};

用這種方式初始化容器,就像是把東西一股腦兒裝進(jìn)箱子里,既直觀又方便。

4. 用于結(jié)構(gòu)體的聚合初始化

對(duì)于簡(jiǎn)單的結(jié)構(gòu)體,花括號(hào)語法同樣好用:

struct Point {
int x;
int y;
};

Point p = {10, 20};  // p.x = 10, p.y = 20

這種方式讓你一次性給結(jié)構(gòu)體的所有成員賦值,按照聲明順序填充。

五、指定初始化(C++20新特性,結(jié)構(gòu)體福音)

struct Point {
    int x;
    int y;
    int z;
};

// C++20允許指定成員名
Point p = {.x = 10, .z = 30};  // p.x = 10, p.y = 0, p.z = 30

有了指定初始化器,你可以只初始化需要的成員,而且順序無關(guān)了!

六、類內(nèi)初始化(偷懶神器)

class User {
private:
    std::string name = "匿名";  // 類內(nèi)初始化
    int age = 0;               // 類內(nèi)初始化
public:
    User() {}  // 構(gòu)造函數(shù)什么都不用做,成員已經(jīng)有默認(rèn)值了
    User(std::string n) : name(n) {}  // 只需要初始化想要改變的成員
};

這種方式很貼心,讓默認(rèn)值就寫在成員變量旁邊,一目了然。

七、實(shí)戰(zhàn):如何選擇合適的初始化方式?

說了這么多,到底該用哪種呢?來點(diǎn)實(shí)用建議:

(1) 優(yōu)先使用花括號(hào)初始化:它最安全,適用范圍最廣,能防止窄化轉(zhuǎn)換。

int a{42};
std::vector<int> v{1, 2, 3};

(2) 對(duì)于內(nèi)置類型的簡(jiǎn)單賦值:傳統(tǒng)方式也OK。

int x = 10;  // 簡(jiǎn)單明了,沒問題

(3) 容器類使用列表初始化:

std::vector<std::string> names = {"張三", "李四", "王五"};

(4) 結(jié)構(gòu)體考慮聚合初始化或指定初始化:

struct Config {
    bool debug;
    int timeout;
};
Config cfg = {true, 30};  // C++17之前
Config cfg = {.debug = true, .timeout = 30};  // C++20

(5) 類內(nèi)默認(rèn)初始化:讓代碼更簡(jiǎn)潔。

class Settings {
    bool darkMode = false;
    int fontSize = 14;
public:
    // 構(gòu)造函數(shù)可以更簡(jiǎn)潔了
};

八、踩坑警告!

在實(shí)際使用中,還是有一些坑需要注意:

(1) 最可怕的未初始化變量:

int x;  // 危險(xiǎn)!x包含垃圾值
bool done;  // 可能是true也可能是false,完全隨機(jī)

解決方案:養(yǎng)成習(xí)慣,變量定義時(shí)就初始化。

(2) 隱式轉(zhuǎn)換陷阱:

void process(const std::vector<int>& data);

process({1, 2, 3});  // 可以!編譯器幫你構(gòu)造臨時(shí)vector

這種隱式轉(zhuǎn)換有時(shí)很方便,有時(shí)又會(huì)導(dǎo)致意外的開銷。

(3) 初始化順序問題:

class Trouble {
    int value = helper();  // 類內(nèi)初始化
    int result;
    
    int helper() { return result + 1; }  // 危險(xiǎn)!result尚未初始化

public:
    Trouble() : result(42) {}  // 成員初始化順序是按聲明順序,不是這里的順序
};

(4) 容器的花括號(hào)初始化陷阱:

std::vector<int> v1(10, 20);  // 10個(gè)元素,每個(gè)都是20
std::vector<int> v2{10, 20};  // 只有2個(gè)元素:10和20

看起來很像,但意義完全不同!圓括號(hào)是調(diào)用構(gòu)造函數(shù),花括號(hào)是列表初始化。

(5)  零初始化的陷阱:

int arr[5]{};      // 全部初始化為0,很好
int* ptr = new int[5]();  // 也全部初始化為0,很好
int* ptr2 = new int[5];   // 危險(xiǎn)!未初始化,垃圾值

動(dòng)態(tài)分配數(shù)組時(shí),別忘了初始化!

這些坑足夠讓 C++ 初學(xué)者栽上好幾次跟頭。記住,在 C++ 中,初始化是一門小藝術(shù)!正確的初始化方式能讓你的代碼更可靠、更高效、更容易維護(hù)。

九、總結(jié)

好了,C++的初始化大菜已經(jīng)上齊了!回顧一下我們的"菜單":

(1) 傳統(tǒng)賦值式:int a = 10;

(2) 構(gòu)造函數(shù)式:int a(10);

(3) 花括號(hào)初始化大家族:

  • 基本花括號(hào):int a{10};
  • 零初始化:int a{};
  • 容器列表初始化:vector<int> v = {1, 2, 3};
  • 結(jié)構(gòu)體聚合初始化:Point p = {10, 20};

(4) 指定初始化:Point p = {.x=10, .y=20};

(5) 類內(nèi)初始化:class X { int a = 10; };

如果你是 C++ 新手,我建議從花括號(hào)初始化開始習(xí)慣,它最安全也最通用。等你熟悉了這些初始化方式的優(yōu)缺點(diǎn)后,再根據(jù)具體場(chǎng)景選擇最合適的那一個(gè)。

記住:好的初始化習(xí)慣能讓你少掉很多頭發(fā)!希望這篇文章能給你帶來"啊哈"的時(shí)刻,讓你以后看 C++ 代碼時(shí)能一眼看穿各種初始化魔法!

責(zé)任編輯:趙寧寧 來源: 跟著小康學(xué)編程
相關(guān)推薦

2021-09-27 07:39:52

Go初始化函數(shù)package

2022-04-08 09:01:14

CSS自定義屬性前端

2023-11-12 23:08:17

C++初始化

2022-11-09 09:15:31

ProtoBufGo語言

2020-11-17 09:32:57

設(shè)計(jì)模式責(zé)任鏈

2010-02-06 10:24:48

C++二維數(shù)組初始化

2010-02-01 14:21:24

C++初始化列表

2010-02-06 14:40:50

C++初始化和賦值

2019-09-25 08:51:44

Python收藏算法

2020-06-05 14:15:29

可視化數(shù)據(jù)集分析

2022-12-20 07:39:46

2023-11-20 08:18:49

Netty服務(wù)器

2023-12-21 17:11:21

Containerd管理工具命令行

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務(wù)

2023-07-31 08:18:50

Docker參數(shù)容器

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2010-02-05 17:16:05

C++構(gòu)造函數(shù)

2010-02-06 15:58:10

C++集合初始化

2024-03-13 08:52:43

C++初始化方式
點(diǎn)贊
收藏

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

主站蜘蛛池模板: a欧美| a级网站 | 午夜国产一级 | 91av在线免费观看 | 精品一级电影 | 国产精品久久久久久亚洲调教 | 日韩欧美操 | 精品一区二区三 | 黄色高清视频 | www.日本在线播放 | 亚洲一区二区三区免费在线观看 | 国产91九色 | 欧美日韩高清在线观看 | 国产欧美精品 | 99精品久久久久久久 | 日本又色又爽又黄又高潮 | 成人网视频 | 91九色porny首页最多播放 | 一区在线视频 | 欧美 中文字幕 | 亚洲区一区二 | 精品国产一区二区在线 | 日本欧美国产在线 | 久久中文字幕一区 | 国产精品久久久久久久久免费樱桃 | 午夜小电影 | 日本人做爰大片免费观看一老师 | 日本一区二区高清不卡 | 日韩三极 | 黄色片大全在线观看 | 久久免费小视频 | 久久中文字幕电影 | 欧美一区二区三区免费在线观看 | gav成人免费播放视频 | 狠狠色网 | 天天色综| 国产欧美在线视频 | 国产清纯白嫩初高生在线播放视频 | 欧美一卡二卡在线 | 欧美日韩久久精品 | 久久精品国产一区二区电影 |