c 變數初始化 猜想

2021-05-01 06:37:47 字數 2367 閱讀 2796

全域性的、名字空間的、靜態的物件會被自動初始化適當型別的0。

堆,容器中和類的顯式空建構函式的物件會被呼叫其建構函式初始化,但並不會被初始化為相應的0,(沒有陣列)如

char ch[10];

for(int i = 0; i < 10; i++)

cout<<(int)ch[i]《結構和類成員的初始化:

談到結構和類成員,除非提供顯示的建構函式進行初始化,否則可以分為以下兩種(是否用預設建構函式初始化):

class a

//a(){}

public:

int i;

a a;

void f()

a a1;

cout附錄:nontrivial default constructor資訊參見以下:

那麼編譯器會自動為我們產生乙個預設的建構函式。 本來這個錯誤的認識很多程式設計師都有,不足為奇。但有這

麼多年程式設計經驗的高手也有這樣的錯誤認識就不禁讓我啞然了。

其實程式語言和我們所用的任何軟體沒有區別,例如photoshop、autocad之類。其唯一不同的是我們用

的程式語言是基於編譯器的,而應用軟體是基於我們的程式語言的。

既然我們所用的軟體是基於編譯器的,那麼理解編譯器在背後到底為我們做了些什麼、在什麼情況下做

了哪些事情就顯得異常重要。這就像photoshop會為你產生一些基本圖形例如矩形、三角形之類,而不會憑空產

生一些風景優美的一樣。

在《c++ annotated reference manual(arm)[ellis90]》中的section 12.1告訴我們:"default 

constructors...在需要的時候被編譯器產生出來"。

其實預設建構函式也是分為兩類的:有用的、無用的。

所謂有用的標準也是就預設建構函式會為我們的類做一些初始化操作。那麼無用的就不會做任何工作,

從而對我們的類也就沒有任何意義。所以,我們通常所說的預設建構函式是指有用的預設建構函式,其英文名字

叫nontrivial default constructor。

那麼到底什麼時候編譯器會為我們產生nontrivial default constructor呢?有下面四中情況:

①如果乙個類裡面某個成員物件有nontrivial default constructor,編譯器就會為我們的類產生

nontrivial default constructor。

那麼編譯器這樣做的理由是什麼?

答案是因為類成員物件有nontrivial default constructor,那麼編譯器就需要顯式的來呼叫這個類成

員物件的nontrivial default constructor。而編譯器想顯式的呼叫類成員物件的nontrivial default 

constructor,就需要自己來合成一些**來呼叫。但是記住,編譯器合成的nontrivial default constructor僅

僅呼叫類成員物件的預設建構函式,而不對我們類裡面的其它變數做任何初始化操作。

也就是說,如果你想初始化類成員變數以外的變數例如乙個int、乙個string,那麼必須自己定義預設構

造函式來完成這些變數的初始化。而編譯器會對你定義的預設建構函式做相應的擴充套件,從而呼叫類成員物件的

nontrivial default constructor。

②如果乙個派生類的基類有nontrivial default constructor,那麼編譯器會為派生類合成乙個

nontrivial default constructor。

編譯器這樣的理由是:因為派生類被合成時需要顯式呼叫基類的預設建構函式。

③如何乙個類裡面隱式的含有任何virtual function table(或vtbl)、pointer member(或vptr)。

編譯器這樣做的理由很簡單:因為這些vtbl或vptr需要編譯器隱式(implicit)的合成出來,那麼編譯器

就把合成動作放到了預設建構函式裡面。所以編譯器必須自己產生乙個預設建構函式來完成這些操作。

所以如果你的類裡帶有任何virtual function,那麼編譯器會為你合成乙個預設建構函式。

④如果乙個類虛繼承於其它類。

編譯器這樣做的理由和③類似:因為虛繼承需要維護乙個類似指標一樣,可以動態的決定記憶體位址的東

西(不同編譯器對虛繼承的實現不僅相同)。

那麼除了以上四種情況,編譯器並不會為我們的類產生預設建構函式。

所以程式設計中切忌想當然,要明白哪些事情是編譯器做的,哪些事情需要程式設計師來完成的。就像堆所占用

的資源需要程式設計師自己來釋放,而棧空間是編譯器管理的一樣。

只有如此,才能編寫出質量更高的**。

C 初始化變數

1.初始化變數 int i1 7.2 正確,但是i1的值變為了7 int i 建議使用初始值列表 int i2 錯誤 初始值列表確保不會發生某些可能導致資訊丟失的型別轉換 int i3 錯誤 同上,且 是多餘的 2.使用auto關鍵字 struct record auto p new record ...

變數初始化

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

C 類變數初始化

c 類變數初始化 c 為中類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算 c 類中變數的初始化 1.初始化列表 csomeclass csomeclass x 0 y 1 const常量定義必須初始化,且必須使用初始...