Các loại không được "khởi tạo". Chỉ đối tượng của một số loại được khởi tạo. Cách thức và thời điểm chúng được khởi tạo phụ thuộc vào cách thức và vị trí của đối tượng tương ứng được xác định. Bạn không cung cấp định nghĩa của bất kỳ đối tượng nào trong câu hỏi của bạn, do đó, câu hỏi của bạn tự nó không thực sự có ý nghĩa nhiều - nó thiếu bối cảnh cần thiết.
Ví dụ, nếu bạn xác định một đối tượng tĩnh của loại foo
static foo foo_object; // zeros
nó sẽ được tự động zero-khởi tạo bởi vì tất cả các đối tượng với thời gian tĩnh luôn tự động zero-khởi tạo.
Nếu bạn xác định một đối tượng tự động loại foo
mà không có một khởi tạo, nó sẽ vẫn chưa được khởi tạo
void func()
{
foo foo_object; // garbage
}
Nếu bạn xác định một đối tượng tự động loại foo
với một initializer tổng hợp, nó sẽ được khởi tạo theo với điều đó initializer
void func()
{
foo foo_object1 = { 1, 2 }; // initialized
foo foo_object2 = {}; // initialized with zeros
}
Nếu bạn phân bổ đối tượng của bạn với new
và cung cấp không khởi tạo, nó sẽ vẫn chưa được khởi tạo
foo *p = new foo; // garbage in `*p`
Nhưng nếu bạn sử dụng ()
initializer, nó sẽ là zero-initialzed
foo *p = new foo(); // zeros in `*p`
Nếu bạn tạo một đối tượng tạm thời loại foo
sử dụng biểu thức foo()
, kết quả của biểu thức đó sẽ là zero- được khởi tạo
bool b = foo().my_bool; // zero
int i = foo().my_int; // zero
Vì vậy, một lần nữa, trong trường hợp cụ thể của bạn, chi tiết khởi tạo phụ thuộc vào bây giờ bạn tạo đối tượng thuộc loại của bạn chứ không phải trên chính loại của bạn. Bản thân loại của bạn không có cơ sở khởi tạo vốn có và không can thiệp vào việc khởi tạo theo bất kỳ cách nào.
Bạn có chắc chắn đây là C++ không? –
@Noah: Không có 'bool' trong C. Nhưng bạn vẫn có điểm. – sbi
"my_bool sẽ được khởi tạo ngẫu nhiên thành true hoặc false" - có thể, nhưng không nhất thiết. Uninitialized có nghĩa là không được khởi tạo ở tất cả. Tùy thuộc vào những gì bạn đang thực hiện, bộ nhớ cho đối tượng được cho phép, ví dụ như chứa một cái bẫy hoặc giá trị không hợp lệ khác. Sự khác biệt là nếu bạn có một giá trị boolean "ngẫu nhiên" 'x' (đúng hoặc sai), thì kết quả của' x || x' được đảm bảo đúng theo tiêu chuẩn. Nếu bạn lấy giá trị boolean chưa được khởi tạo 'y' thì tiêu chuẩn không nói gì về kết quả của' y || y'. Nó có thể đúng, sai hoặc gây ra sự cố hoặc bất kỳ hành vi nào khác. –