2010-04-19 33 views
29

Trong đoạn mã sau, khi ctor của X được gọi là ctor của A hoặc B được gọi là đầu tiên? Thứ tự mà trong đó chúng được đặt trong cơ thể của lớp kiểm soát điều này? Nếu ai đó có thể cung cấp một đoạn văn bản từ tiêu chuẩn C++ nói về vấn đề này, điều đó sẽ hoàn hảo.C++: Khởi tạo Thứ tự của các thành viên dữ liệu lớp

class A {}; 
class B {}; 
class X 
{ 
A a; 
B b; 
}; 

Trả lời

46

Trình tự là thứ tự chúng xuất hiện trong định nghĩa lớp - đây là từ phần 12.6.2 của ++ Chuẩn C:

5 Khởi tạo có trách nhiệm tiến hành trong trình tự sau:

- Đầu tiên và chỉ dành cho hàm tạo của lớp có nguồn gốc nhất như được mô tả bên dưới, lớp cơ sở ảo sẽ được khởi tạo theo thứ tự chúng xuất hiện trên độ sâu di chuyển trái sang phải đầu tiên củaBiểu đồ tuần hoàn theo hướngcủa các lớp cơ sở , trong đó “từ trái sang phải” là thứ tự xuất hiện của lớp cơ sở tên trong lớp dẫn xuất danh sách-specifier-list.

- Sau đó, trực tiếp lớp cơ sở sẽ được khởi tạo trong trật tự khai như chúng xuất hiện trong cơ sở-specifier-list (không phân biệt thứ tự của các mem-initializers).

- Sau đó, không tĩnh thành viên dữ liệu được khởi tạo theo thứ tự họ khai báo trong định nghĩa lớp (một lần nữa không phụ thuộc vào thứ tự của các mem-initializers).

- Cuối cùng, nội dung của hàm tạo được thực hiện. [Lưu ý: thứ tự khai báo được uỷ quyền là đảm bảo rằng các đối tượng con của cơ sở và thành viên bị hủy theo thứ tự ngược lại của khởi tạo. ]

+2

Ồ, tôi vừa mới gửi. Gr. – GManNickG

+4

@GMan Cuộc đua không phải lúc nào cũng nhanh chóng. Trừ khi nó được. –

+0

Tôi đã phải chờ đợi để chấp nhận câu trả lời trong 7 phút sau khi nó được đăng, nó đã được nhanh chóng. Không biết SO có hạn chế này khi chấp nhận câu trả lời. – Nikhil

8

Khởi luôn là theo thứ tự mà các thành viên lớp xuất hiện trong định nghĩa lớp học của bạn, vì vậy trong ví dụ của bạn a, sau đó b.

Có một điểm chuỗi giữa khởi tạo của mỗi thành viên và bạn có thể chuyển tham chiếu đến thành viên chưa được khởi tạo vào hàm tạo của thành viên nhóm nhưng bạn sẽ chỉ có thể sử dụng trong giới hạn cách (chẳng hạn như lấy địa chỉ của nó để tạo thành một con trỏ), các ứng dụng khác cũng có thể gây ra hành vi không xác định.

Tiêu hủy thành viên của lớp luôn xảy ra theo thứ tự xây dựng ngược lại.

Thứ tự khởi tạo căn cứ và thành viên được xác định trong 12.6.2 [class.base.init]/5.

+0

Bạn có thể cung cấp tham chiếu không? – Nikhil

+0

Để thêm vào điều này, nếu bạn có một hàm tạo cho X như thế này - X(): b(), a() {} a vẫn được khởi tạo trước tiên. –

+0

Tôi biết điều này. Tôi yêu cầu một tham chiếu. Tôi tự tin nói điều này với một người yêu cầu một tài liệu tham khảo và tôi không thể tìm thấy một. Do đó câu hỏi. – Nikhil

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