- C++服務(wù)器開發(fā)精髓
- 張遠龍
- 1027字
- 2021-07-23 18:22:07
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其他容器的同名方法用法一樣:

- Python Deep Learning
- 軟件測試項目實戰(zhàn)之性能測試篇
- 數(shù)據(jù)結(jié)構(gòu)(Python語言描述)(第2版)
- Mastering PHP Design Patterns
- Mastering Python High Performance
- 機械工程師Python編程:入門、實戰(zhàn)與進階
- Learning ELK Stack
- Learning ArcGIS for Desktop
- Python Web數(shù)據(jù)分析可視化:基于Django框架的開發(fā)實戰(zhàn)
- NGINX Cookbook
- 響應(yīng)式架構(gòu):消息模式Actor實現(xiàn)與Scala、Akka應(yīng)用集成
- 零基礎(chǔ)輕松學C++:青少年趣味編程(全彩版)
- 奔跑吧 Linux內(nèi)核
- Shopify Application Development
- jQuery Mobile Web Development Essentials(Second Edition)