2010-01-19 39 views
8

Một đối tượng của cấu trúc/lớp (không có constructor) có thể được tạo bằng cách sử dụng danh sách khởi tạo . Tại sao điều này không được phép đối với cấu trúc/lớp học với số hàm tạo?C++: Danh sách Constructor so với initializer trong struct/class

struct r { int a; }; 
struct s { int a; s() : a(0) {} }; 
r = { 1 }; // works 
s = { 1 }; // does not work 
+2

Đăng một số mã minh họa những gì bạn đang hỏi. –

+1

Neil, câu trả lời có ý nghĩa với tôi. – Anycorn

Trả lời

13

Không, đối tượng có hàm tạo không còn được coi là POD (dữ liệu thuần cũ). Đối tượng chỉ được chứa các loại POD khác làm thành viên không tĩnh (bao gồm các loại cơ bản). POD có thể có các hàm tĩnh và các thành viên dữ liệu phức tạp tĩnh.

Lưu ý rằng chuẩn C++ sắp tới sẽ cho phép bạn xác định danh sách khởi tạo, cho phép các đối tượng không phải POD được khởi tạo bằng dấu ngoặc.

0

Nếu trước câu hỏi của bạn, bạn có nghĩa là để hỏi, "Tôi có thể làm điều này:"

struct MyGizmo 
{ 
    char things_[5]; 
    MyGizmo() : things_({'a', 'b', 'c', 'd', 'e'})(); 
}; 

... thì câu trả lời là không. C++ không cho phép điều này.

+0

Không, khởi tạo một mảng các ký tự khác với việc khởi tạo một cấu trúc POD có thể chứa các biến của các kiểu khác nhau. Ngoài ra, bạn đang làm nó ctor, OP yêu cầu khởi tạo trên một đối tượng có một ctor xác định. – Macke

+0

thực sự, g ++ có một heck để làm điều đó, không phải tiêu chuẩn: (char [1]) {0} – Anycorn

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