類内成員初始化
定義成員變量時,可以像static const變量一樣就地初始化,但static變量則不可以,還要像C 98一樣在類外初始化。
在C 17的标準中,通過使用inline關鍵字,可以對static成員變量地初始化
所有引入foo的cpp文件中看到的都是相同的對象,就如同在一個cpp文件中定義,在其它cpp文件中extern這個變量,編譯器确保該變量所在的可見範圍内全局唯一。
初始化列表
為了統一初始化方式,并且讓初始化行為具有确定的效果,C 11提出了初始化列表
STL中的容器是通過使用std::initializer_list這個輕量級的類模闆來完成上述功能支持的。隻需要為自定義類添加一個std::initializer_list構造函數,該類就可以擁有這種任意長度的初始化能力。
std::initializer_list也可以用在一般函數,用來傳遞同類型的數據集合。
std::initializer_list說明:
1)輕量級模闆容器,可以通過iterator操作,但隻有3個接口函數:size、begin和end
2)可以接收任意長度的初始化列表,但必須是同類型元素
3)隻能被整體初始化或賦值
防止類型收窄
類型收窄指的是導緻數據内容發生變化或者精度丢失的隐式類型轉換。使用列表初始化可以防止類型收窄。
如下是常見的類型收窄情況,編譯器可能不會有告警或錯誤,但經過隐式轉換後,值變了
1、浮點數隐式轉為整數。 int i = 0.3;
2、高精度浮點數隐式轉為低精度浮點數。long double -> double -> float
3、整型轉浮點型,整型值大于浮點型
4、長整型轉為短整型
,