/**********
【初始化的基本概念】
事實:初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。
列表初始化:(<> p39)
作為c++11新標準的一部分,用花括號{}來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。
現在,無論是初始化物件還是某些時候為物件賦新值,都可以使用一組花括號括起來的初始值了。
當用於內建型別的變數時,如果我們使用列表初始化且初始值存在丟失資訊的風險時,編譯器會報錯。
預設初始化:(<> p40)
如果定義變數時沒有指定初值,則變數被預設初始化。此時變數被賦予「預設值」。
什麼決定了預設值?
1.變數型別
2.定義變數的位置
如果是內建型別的變數未被顯示初始化,它的值由定義的位置決定。
·定義於任何函式體之外的變數被初始化為0
·一種例外,定義在函式體內部的內建型別變數將不被初始化(函式形參也是函式體內的自動變數,未被初始化也會是未定義的)
(未被初始化的內建型別變數的值是未定義的,如果試圖拷貝或以其他形式進行訪問將引發錯誤)
如果是類,由類自己決定初始化物件的方式。而且,是否允許不經過初始化就定義物件也由類自己決定。
絕大多數類都支援無需顯式初始化而定義物件,這樣的類提供了乙個合適的預設值。
(定義於函式體內的內建型別的物件如果沒有初始化,則其值是未定義的)
(類的物件如果沒有顯式地初始化,則其值由類確定)
小結1:
1.什麼是列表初始化? --> {}
2.什麼是預設初始化? --> 定義變數時沒有指定初值,則變數被預設初始化。
3.什麼決定預設值? --> 型別 + 位置
·內建型別,定義在任何函式體之外的變數被初始化為0
·類型別,由類自己決定。預設初始化應該就可以理解為呼叫預設的無參建構函式
附加一點 --> 對於類中那些依賴於編譯器合成的預設建構函式的內建型別成員,如果它們未在類內被初始化,那麼它們的值也是未定義的!(<> p236/p408)
**********/
#include #include using namespace std;
// 列表初始化
void init1()
; int num3;
int num4(0);
cout << num1 << num2 << num3 << num4 << endl;
long double ld = 3.1415926536;
// int a, b = ; // 錯誤:轉換未執行,因為存在丟失資訊的危險
int c(ld), d = ld; // 正確:轉換執行,且確實丟失了部分值
}int a1, a2, a3, a4; // 內建型別,函式體外,初始化為0
// 預設初始化
void init2()
class test
private:
char cc;
int a, b, c, d, e; // 未定義的!!!!! 雖然初看起來不在函式體內,但是其實應該這樣理解,這些變數是在建構函式中定義的,而建構函式也是乙個函式體,因此執行的是預設初始化,且是未定義的
string s = "hello"; // 提供了乙個類內初始值,在執行預設建構函式時,會用這個「類內初始值」來初始化該成員。否則,像上那樣執行預設初始化
};void init3()
void init4()
// 練習
string global_str;
int global_int;
void exercise1()
int main()
值初始化和預設初始化
引用 1 值初始化 顧名思義,就是用數值初始化變數。如果沒有給定乙個初始值,就會根據變數或類物件的型別提供乙個初始值。對於int型別其值初始化後的值為0。對於預設初始化內建型別變數來說 1 定義在函式體之外的變數是全域性變數,一般儲存在全域性區,儲存在全域性區的變數一般會執行值初始化。此時,其初始值...
初始化 指定初始化
id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...
預設初始化
雖然保險的做法是對每個變數都顯示初始化,但是了解一下預設初始化的規則也是很有必要的。1.定義於任何函式體之外的變數被初始化為0。2.定義在函式體內部的區域性變數不會被預設初始化。所以,它的值是未定義的 這裡的 未定義 我的理解 變數所分配記憶體中的二進位制資料,分配時是什麼就是什麼,機器會按照變數的...