C 變數的預設初始化和值初始化

2022-06-12 16:21:10 字數 2798 閱讀 3090

值初始化:

(1)在陣列初始化的過程中,如果提供的初始值數量少於陣列的大小,剩下的元素會進行值初始化;

(2)靜態static變數、定義在塊作用域外的全域性變數,如果沒有顯式的初始值,將執行值初始化;

(3)當我們通過書寫形如t()的表示式(例如 int())顯式地請求值初始化時;

預設初始化:

(1)當我們在塊作用域內(類內也屬於塊作用域內)不使用任何初始值定義乙個非靜態變數時;

(2)當乙個類本身含有類型別成員且使用合成的預設建構函式時;

(3)當類型別的成員沒有在建構函式初始值列表中顯式地初始化時;

宣告:在環境/上下文中指定乙個變數的名字。也就是說,宣告僅僅是讓編譯器知道,而沒有實際分配空間。

初始化:給乙個宣告後尚未初始化的變數乙個有意義的初始值。

賦值 : 銷毀乙個變數原來的值,並賦予乙個新值。相當於改變了乙個變數的狀態

二、初始化是在宣告乙個變數的同時賦予它乙個值,而賦值是已經宣告過了變數,後續再對它進行賦值操作。對於內建型別:

//

在乙個塊作用域內

三、對於定義了自己的建構函式的類型別(例如string)來說,不管採用預設初始化還是值初始化,物件都會通過預設建構函式來初始化。但對於內建型別,值初始化的內建型別物件有著良好定義的值,而預設初始化的物件的值則是未定義的。對於類中那些依賴於編譯器合成的預設建構函式的內建型別成員,如果他們未在類內被初始化,那麼它們的值也是未定義的。

string *ps1 = new

string; //

預設初始化為空string

string *ps2 = new

string(); //

值初始化為空string

int *pi1 = new

int; //

預設初始化;*pi1的值未定義

int *pi2 = new

int(); //

值初始化為0;*pi2為0

class

x x() = default;};

intmain()

四、定義於塊作用域內(類內也屬於塊作用域內)的內建型別變數將不被初始化,其值未定義;定義於塊作用域外的全域性變數被值初始化為0。靜態static變數如果沒有顯式的初始值,它將執行值初始化。

class

x x() = default;};

intmain()

五、對於自定義型別和stl中的容器,

class

a;a a=a(); //

值初始化

std::vector vec1; //

預設初始化,呼叫預設建構函式

乙個類物件進行預設初始化和值初始化,必須要有相應的預設建構函式。否則將會報錯,因為無法構造這個類。

宣告:在環境/上下文中指定乙個變數的名字。也就是說,宣告僅僅是讓編譯器知道,而沒有實際分配空間。

初始化:給乙個宣告後尚未初始化的變數乙個有意義的初始值。

賦值 : 銷毀乙個變數原來的值,並賦予乙個新值。相當於改變了乙個變數的狀態

二、初始化是在宣告乙個變數的同時賦予它乙個值,而賦值是已經宣告過了變數,後續再對它進行賦值操作。對於內建型別:

//

在乙個塊作用域內

三、對於定義了自己的建構函式的類型別(例如string)來說,不管採用預設初始化還是值初始化,物件都會通過預設建構函式來初始化。但對於內建型別,值初始化的內建型別物件有著良好定義的值,而預設初始化的物件的值則是未定義的。對於類中那些依賴於編譯器合成的預設建構函式的內建型別成員,如果他們未在類內被初始化,那麼它們的值也是未定義的。

string *ps1 = new

string; //

預設初始化為空string

string *ps2 = new

string(); //

值初始化為空string

int *pi1 = new

int; //

預設初始化;*pi1的值未定義

int *pi2 = new

int(); //

值初始化為0;*pi2為0

class

x x() = default;};

intmain()

四、定義於塊作用域內(類內也屬於塊作用域內)的內建型別變數將不被初始化,其值未定義;定義於塊作用域外的全域性變數被值初始化為0。靜態static變數如果沒有顯式的初始值,它將執行值初始化。

class

x x() = default;};

intmain()

五、對於自定義型別和stl中的容器,

class

a;a a=a(); //

值初始化

std::vector vec1; //

預設初始化,呼叫預設建構函式

乙個類物件進行預設初始化和值初始化,必須要有相應的預設建構函式。否則將會報錯,因為無法構造這個類。

值初始化和預設初始化

引用 1 值初始化 顧名思義,就是用數值初始化變數。如果沒有給定乙個初始值,就會根據變數或類物件的型別提供乙個初始值。對於int型別其值初始化後的值為0。對於預設初始化內建型別變數來說 1 定義在函式體之外的變數是全域性變數,一般儲存在全域性區,儲存在全域性區的變數一般會執行值初始化。此時,其初始值...

值初始化和預設初始化的區別

如果使用等號 初始化乙個變數,實際上執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中去。與之相反,如果不使用等號,則執行的是直接初始化。當初始值只有乙個時,使用直接初始化或拷貝初始化都行。如果用多個值進行初始化的情況,非要用拷貝初始化的方式處理也不是不可以,不過需要顯式地建立乙個 臨...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...