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ự.
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