Trình tự đánh giá danh sách khởi tạo xây dựng


252

Tôi có một hàm tạo có một số đối số. Tôi đã giả định rằng chúng được xây dựng theo thứ tự được liệt kê, nhưng trong một trường hợp, có vẻ như chúng được xây dựng ngược lại dẫn đến phá thai. Khi tôi đảo ngược các đối số, chương trình đã ngừng hủy bỏ. Đây là một ví dụ về cú pháp tôi đang sử dụng. Vấn đề là, a_ cần phải được khởi tạo trước b_ trong trường hợp này. Bạn có thể đảm bảo thứ tự xây dựng?

ví dụ

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};

6
Bạn nói rằng bạn đang hỏi về các đối số của hàm tạo, nhưng chúng được đánh giá trước khi bạn tiếp cận với hàm tạo và chúng được đánh giá theo thứ tự không xác định, do trình biên dịch xác định. Nhưng bạn thực sự đang hỏi về thứ tự của danh sách khởi tạo, vì vậy tôi đã thay đổi tiêu đề câu hỏi cho bạn.
Rob Kennedy

Câu trả lời:


278

Nó phụ thuộc vào thứ tự khai báo biến thành viên trong lớp. Vì vậy, a_sẽ là cái đầu tiên, sau đó b_sẽ là cái thứ hai trong ví dụ của bạn.


22
Trong thực tế, trình biên dịch tốt sẽ cảnh báo nếu bạn có một thứ tự khác trong khai báo so với danh sách trình khởi tạo hàm tạo. Ví dụ, xem -Wreordertrong gcc.
Greg Hewgill

236
Lý do mà chúng được xây dựng theo thứ tự khai báo thành viên và không theo thứ tự trong hàm tạo là vì người ta có thể có một số hàm tạo, nhưng chỉ có một hàm hủy. Và kẻ hủy diệt tiêu diệt các thành viên theo thứ tự xây dựng lại.
Lập trình viên

3
ý chúng tôi là ... thứ tự ngược lại của việc khai báo. Không phải là "xây dựng", hàm hủy có thể có thể nhìn vào hàm tạo để biết không?
Conrad B

196

Để trích dẫn tiêu chuẩn, để làm rõ:

12.6.2.5

Khởi tạo sẽ được tiến hành theo thứ tự sau:

...

  • Sau đó, các thành viên dữ liệu phi tập trung sẽ được khởi tạo theo thứ tự chúng được khai báo trong định nghĩa lớp (một lần nữa bất kể thứ tự của các trình khởi tạo mem).

...


18

Các tài liệu tham khảo chuẩn cho điều này bây giờ dường như là 12.6.2 phần 13,3:

(13.3) - Sau đó, các thành viên dữ liệu không tĩnh được khởi tạo theo thứ tự chúng được khai báo trong định nghĩa lớp (một lần nữa bất kể thứ tự của bộ khởi tạo mem).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.