[英]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.