簡體   English   中英

編譯器在C ++中生成的默認構造函數

[英]a compiler generated default constructor in c++

聲明結構表:

struct Tables {
       int i;
       int vi[10];
       Table t1;
       Table vt[10];
};

Tables tt;

假設為Table定義了用戶錯誤構造函數。

在這里,tt.t1將使用Table的默認構造器以及tt.vt中的每個元素進行初始化。

另一方面,tt.i和tt.vi未初始化,因為這些對象不是類類型。

因此,我們保留了一個半初始化對象tt。

如果我理解得很好-如果不會在代碼中顯式初始化tt.i或tt.vi,則在創建tt之后,如果嘗試從中讀取值,則會引發錯誤?

2)有人可以向我解釋一下,為什么cpp設計人員不想簡單地將內置類型int和int []初始化為零?

不,不會拋出任何錯誤。 您會有輕微的不確定行為。 但是,由於整數沒有陷阱值,因此無法檢測到該行為。

請注意,C ++語言本身僅非常非常罕見地引發異常-大約只有我能想到的一次,它是通過dynamic_cast對引用執行無效的轉換時以及在new分配失敗時發生異常的地方。 當然,標准庫可能會引發許多錯誤情況。

至於為什么C ++如此工作(以及C也是如此),那么初始化很費時間,如果不需要它,那會浪費時間。 例如,如果您打算立即將用戶輸入讀入這些變量,那么在進行初始化之前沒有什么意義。

不會引發錯誤,這不是Java。 :)

返回的內容將是那時內存中發生的任何事情。 您擁有的是一個“未初始化”變量。 可能為0。可能為42。每次都將是不可預測的。

故事的寓意-初始化所有變量。 否則可能會導致難以置信的錯誤。

由於這是C ++,請使用默認構造函數初始化您的結構:

struct Tables { 
       int i; 
       int vi[10]; 
       Table t1; 
       Table vt[10]; 

Tables() {
  i = 0;
  for (int iter = 0; iter < 10; iter++)
    vi[iter] = 0;
}

}; 

Tables tt;

由於它們不是指針類型,因此將使用該位置堆棧上的內容填充它們。 如果它們是指針類型,並且您在未正確初始化它們的情況下取消了對它們的引用,則是的,您將遇到問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM