初學者在剛開始讀 C++ Primer 的時候,總是容易被書中各種初始化搞得頭大:預設初始化、清單初始化、值初始化、類内初始值、構造函數初始值清單、 new int new int()
和
的差別...
本文把書中這些概念集中總結如下,大括号【】内為原書中文版第 5 版的相應頁碼。
- 清單初始化(list initialization)【P39】:用花括号
來初始化變量,在 C++11 中得到全面應用{}
-
// 以下 4 種初始化的形式都可以 int i = 0; int i = {0}; int i{0}; int i(0); long double ld = 3.1415; int a{ld}; // 報錯,轉換存在資訊丢失的風險 int b = {ld}; // 報錯,轉換存在資訊丢失的風險 int c(ld); // 正确,但資訊丢失 int d = ld; // 正确,但資訊丢失
- 如果清單初始化存在資訊丢失的風險, 編譯器将報錯。
-
- 預設初始化【P40】:如果定義變量時沒有指定初始值,則變量被預設初始化
- 預設情況下,數組元素被預設初始化【P101】
- 類類型:由類負責初始化
- 内置類型
- 定義在任何函數體之外(可以在命名空間中):初始化為 0
- 定義在函數體内部(包括定義在類内的類成員【P236】)的非靜态變量:未初始化!
- 局部靜态變量【P185】:如果沒有顯式的初始值,将執行值初始化,内置類型将初始化為 0
- 值初始化(value initialization)【P88、P118】
- 何時進行值初始化?
- 隻提供容器(數組除外?)的元素數量而不指定初值時,就會執行值初始化
- 内置類型局部靜态變量 【P185】
- new 類型,後面帶圓括号,如:
,new int()
【P408】new string()
- 内置類型:初始值設為 0
- 類類型:由類的預設構造函數初始化
- 何時進行值初始化?
- 類的對象無論在函數内/外,全局/局部,靜态/非靜态,其初始化都是由類負責
- 類内初始值【P65】
- 構造函數初始值清單【P238】
- 類内初始值(in-class initializer)【P65】
- C++11 新标準,在類的定義中直接指定初值,可以用等号或者花括号,但是不能用圓括号。
-
class SalesData { std::string bookNo; unsigned unitsSold = 0; double revenue {0.0}; };
- 【P238】推薦使用類内初始值!
- 構造函數初始值清單【P238】:用構造函數的參數初始化成員變量。
-
class SalesData { public: SalesData(const std::string &s) : bookNo(s) {} SalesData(const std::string &s, unsigned n, double p) : bookNo(s), unitsSold(n), revenue(p*n) {} };
-
- new【P408】
-
string *ps1 = new string; // 預設初始化為空 string string *ps2 = new string(); // 值初始化為空 string int *pi1 = new int; // 預設初始化,*pi1 值未定義! int *pi2 = new int(); // 值初始化,*pi2 為 0 const int *pci - new const int(1024); // 配置設定并初始化一個 const int
-
原文位址:https://www.cnblogs.com/tengzijian/p/15376463.html