官术网_书友最值得收藏!

1.4 統(tǒng)一的類成員初始化語法與std::initializer_list<T>

假設(shè)類A有一個類型為int數(shù)組的成員變量,在C++98/03標準中,如果我們要在構(gòu)造函數(shù)中對這個成員變量進行初始化,則需要這樣寫:

對于字符數(shù)組,我們可能就要在構(gòu)造函數(shù)中使用 strcpy、memcpy 這一類函數(shù)了;再者,如果數(shù)組元素足夠多,初始值又沒什么規(guī)律,則這種賦值代碼會有很多行。但是,如果arr是一個局部變量,則我們在定義arr時可以使用如下語法對其進行初始化:

int arr[4]={2,0,1,9};

既然在C++98/03標準中局部變量數(shù)組支持這種語法,那么為什么在類成員變量語法中不支持這種語法呢?這是舊語法不合理的一個地方。因此在C++11語法中,對類成員變量也可以使用這種語法進行初始化:

可以看出,新語法比舊語法更加簡潔。

在Java這類語言中定義一個類時,可以為其成員變量設(shè)置一個初始值,語法如下:

但在C++98/03標準中,對類的成員必須使用static const修飾,而且類型必須是整型(包括bool、char、int、long等),這樣才能使用這種初始化語法:

在C++11標準中就沒有這種限制了,我們可以使用花括號(即{})對任意類型的變量進行初始化,而且不用是static類型:

當然,在實際開發(fā)中,建議還是將這些成員變量的初始化統(tǒng)一寫到構(gòu)造函數(shù)的初始化列表中,方便閱讀和維護代碼。

綜上所述,在C++11標準中,無論是局部變量還是類變量,使用花括號({})初始化的語法被統(tǒng)一起來,寫法也變得簡潔。

那么這種語法是如何實現(xiàn)的呢?如何在自定義類中也支持這種花括號呢?這就需要用到C++11新引入的對象std::initializer_list<T>了。它是一個模板對象,接收一個自定義參數(shù)類型 T,T既可以是基礎(chǔ)數(shù)據(jù)類型(如編譯器內(nèi)置的 bool、char、int等),也可以是自定義的復(fù)雜數(shù)據(jù)類型。為了使用 std::initializer_list<T>,需要包含頭文件,下面是一個例子:

在以上代碼中自定義了一個類A,為了讓A的構(gòu)造函數(shù)和append方法同時支持花括號語法,給這兩個方法同時設(shè)置了一個參數(shù) integers,參數(shù)的類型均為 std::initializer_list<int>,程序執(zhí)行結(jié)果如下:

再來看一個例子,網(wǎng)上某C++JSON庫支持采用如下語法創(chuàng)建一個JSON對象:

那么,這個 json::array 方法是如何實現(xiàn)的呢?這利用 std::initializer_list<T>也很容易實現(xiàn),首先在花括號中有兩個元素{"currency","USD"}和{"value",42.99},且這兩個元素的值不一樣,前者是兩個字符串類型,后者是一個字符串類型和一個浮點類型。因此,我們可以創(chuàng)建兩個構(gòu)造函數(shù)分別支持這兩種類型的構(gòu)造函數(shù),構(gòu)造的對象類型為jsonNode;然后創(chuàng)建一個 JSON 對象,實現(xiàn)其 array 方法,該方法接收一個參數(shù),參數(shù)類型為std::initializer_list<jsonNode>。完整的代碼如下:

程序執(zhí)行結(jié)果如下:

希望讀者通過上面兩個例子理解 std::initializer_list<T>的使用場景。std::initializer_list<T>除了提供了構(gòu)造函數(shù),還提供了三個成員函數(shù),這和 stl其他容器的同名方法用法一樣:

主站蜘蛛池模板: 琼海市| 藁城市| 赤水市| 荥经县| 巴彦县| 广昌县| 邵东县| SHOW| 瓦房店市| 新郑市| 鲁甸县| 吴旗县| 成安县| 鲜城| 密云县| 城步| 都兰县| 梁河县| 揭东县| 广南县| 湖州市| 南汇区| 辽阳市| 弥渡县| 信丰县| 阿鲁科尔沁旗| 昂仁县| 澄迈县| 通道| 邹平县| 会宁县| 嘉禾县| 拜泉县| 自治县| 永宁县| 响水县| 邛崃市| 吉隆县| 策勒县| 沿河| 平谷区|