2011-11-20 36 views
5

Từ này answer, Trong C++ 03, loại POD được khởi tạo mặc định nếu () bị bỏ qua nếu không nó được khởi tạo giá trị.Mặc định được khởi tạo so với Giá trị được khởi tạo

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

Nhưng nếu người xây dựng do người dùng xác định, có bất kỳ đối tượng nào dưới đây được coi là mặc định hoặc được khởi tạo giá trị không?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

Trong ví dụ của bạn, cả hai lệnh gọi đến hàm tạo phương thức 'bar' trong việc cung cấp một giá trị trong khi khởi tạo' x'. – Chad

Trả lời

2

Nếu lớp của bạn có hàm tạo mặc định do người dùng xác định, thì cả khởi tạo mặc định và giá trị khiến hàm tạo được gọi. Bất cứ điều gì xảy ra tiếp theo là đến các nhà xây dựng:

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

Cả hai mặc định và giá trị khởi tạo của một đối tượng của lớp UDT sẽ gây UDT::aUDT::c là giá trị khởi tạo (để a là zero) vì danh sách initializer nói như vậy, trong khi UDT::bUDT::d là bản thân được khởi tạo mặc định (vì vậy b không được khởi tạo và đối với d áp dụng cùng một logic đệ quy).

Để biết chi tiết về khởi tạo, hãy xem 8.5 và trên danh sách bộ khởi tạo xem 12.6.2 (khoản 8).

3

Trong C++ 03, loại POD được khởi tạo mặc định nếu() bị bỏ qua nếu không nó được khởi tạo giá trị.

Đó không phải là chính xác những gì sẽ xảy ra. Theo thông số C++ 03, mục 8.5/9, nếu không có bộ khởi tạo nào được chỉ định cho một đối tượng kiểu POD không tĩnh thì nó và các đối tượng con của nó "có một giá trị ban đầu không xác định". Đó là không phải điều tương tự như khởi tạo mặc định. Khởi tạo mặc định cũng giống như khởi tạo giá trị cho kiểu POD, điều này có nghĩa là đối tượng được khởi tạo bằng không (8.5/5), nhưng điều đó chỉ có thể xảy ra với sự hiện diện của bộ khởi tạo trống (nghĩa là dấu ngoặc đơn trống) mỗi 8.5/7). Vì vậy, bạn chỉ có thể mặc định và/hoặc giá trị khởi tạo một loại POD với một bộ khởi tạo rỗng. Khởi tạo mặc định cho kiểu POD không tĩnh không xảy ra khi không có trình khởi tạo nào được chỉ định. Trong ví dụ thứ hai của bạn, với loại không POD có hàm tạo do người dùng xác định, khởi tạo mặc định sẽ diễn ra kỹ thuật nếu bạn bỏ qua các ký hiệu giá trị khởi tạo (dấu ngoặc đơn). Nói cách khác:

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

Hãy ghi nhớ rằng mặc dù với cả hai phi POD struct hoặc tầm cỡ loại, nếu có một nhà xây dựng người dùng định nghĩa, mặc định-khởi và giá trị khởi tạo, mỗi 8,5/5, cả hai cuộc gọi constructor do người dùng định nghĩa. Vì vậy, cuối cùng, với loại bar như bạn đã khai báo nó, mặc định và khởi tạo giá trị kết thúc làm điều tương tự.

Các vấn đề liên quan