變數初始化的方式

2022-08-30 13:48:14 字數 1815 閱讀 6042

當物件在建立時獲得了乙個特定的值,我們說這個物件被初始化了。用於初始化變數的值可以是任意複雜的表示式。當一次定義了兩個或多個變數時,物件的名字在定義後就馬上可以使用了。例如我們可以這樣使用:

// 使用剛剛定義的price初始化discount

double price = 109.99, discount = price * 0.16;

這裡需要注意的是,初始化和賦值是兩個完全不同的操作。初始化不是賦值,初始化的含義是建立變數時賦予其乙個初始值,而賦值的含義是把物件的當前值擦除,然後以乙個新值代替。

c++11標準規定,無論是初始化物件還是某些時候給乙個物件賦予新值都可以使用一組由花括號括起來的初始值。這種初始化形式被稱為列表初始化。這樣的初始化形式有乙個重要特點:如果我們使用列表初始化時可能導致資訊的丟失,則編譯器不會通過,例如:

long double ld = 3.1415926535;

int a, b = ; // 錯誤:需要收縮轉換

int c(ld), d = ld; // 正確:但是值會被截斷

如果定義變數沒有指定乙個初始值,則這個變數會被預設初始化,這樣的變數被賦予「預設值」。這個預設值是什麼由變數的型別和變數的位置決定。

如果內建型別的變數未被顯式初始化,則它的值取決於它在**被定義。在任何函式體外部定義的變數被初始化為0。而定義於函式內部的內建型別變數是未初始化的。乙個未被初始化的內建型別的變數的值是未定義的,如果試圖拷貝或以其他形式訪問此類值將引發錯誤。

每個類自己決定我們初始化這個類型別物件的方式。進一步說,我們是否能夠不初始化地定義這個類的物件也是由類自己決定。如果我們能夠不經初始化就定義物件,那麼這個類自己決定物件的初始值將會是什麼。

如果使用等號(=)初始化乙個變數,實際上執行的是拷貝初始化;反之,如果不使用等號,則執行的是直接初始化。例如:

string s1 = "hi";        // 拷貝初始化

string s2("hi"); // 直接初始化

string s3(10, 'c'); // 直接初始化

通常來說,類似於s3這類的初始化值有多個的情況,一般只能使用直接初始化,但是非要用拷貝初始化也有辦法,顯式地建立乙個(臨時)物件用於拷貝即可:

string s4 = string(10, 'c')    // 拷貝初始化
以vector為例,通常情況下,可以給vector物件只提供容納元素的數量而略去初始值。此時庫會建立乙個值初始化的元素賦給容器中的所有元素。這個初值由vector物件中元素的型別決定。

如果vector中的元素是內建型別,例如int型別,則初值將是0。如果是乙個類型別,例如string,則元素由其預設初始化:

vectorivec(10);    // 10個元素,每個都被初始化為0

vectorsvec(10); // 10個元素,每個都是乙個空string物件

這種初始化方式有兩個特殊限制:其一是一些類要求必須明確地提供初始值,如果vector物件中元素的型別不支援預設初始化,我們就必須提供初始化元素值。對於這種型別的物件,只提供乙個元素數量而沒有設定初始值無法完成初始化工作。

其二是如果只提供了元素的數量而沒有設定初始值,只能使用直接初始化:

vectorv1 = 10;     // 錯誤:必須使用直接初始化的形式指定向量大小

vectorv2(10); // 正確

究其深層原因,是因為接收乙個容量引數的vector建構函式是explicit的,所以不能夠使用「=」來隱式轉換。

變數初始化

int a 是變數定義,也就是說編譯器將為a分配儲存,這在編譯時被處理。int a 0 是定義 初始化,定義的分配儲存的action在編譯時完成,初始化的action則在執行時完成 將執行類似dword ptr ebp 4 0的指令,而單獨的int a 不會有對應的執行指令 定義是分配空間,而初始化...

變數的初始化

變數可以分為兩種,一種是方法內的區域性變數,另一種是類的成員變數 對於區域性變數,編譯器強制只有在初始化其值得時候才能使用,而成員變數會進行預設初始化。一 區域性變數必須先初始化後使用 public class test 二 成員變數的初始化 所有的成員變數 包括基本型別和類引用 其自動初始化是在剛...

變數的初始化

1.關於基本資料型別和引用資料型別初始化的值 package com.dbzhang.demo2 public class watersource public string tostring package com.dbzhang.demo2 public class sprinklersyste...