Tôi thấy trong một số cuốn sách rằng thứ tự hủy của các thành viên dữ liệu trong lớp nên theo thứ tự ngược lại của trật tự xây dựng của họ. Lý do của quy tắc này là gì? Bất kỳ ví dụ được đánh giá cao.Tại sao thứ tự hủy diệt cho vấn đề thành viên dữ liệu?
Trả lời
Điều này phần lớn là để nhất quán. Khi nhiều đối tượng được tạo theo trình tự, chúng luôn bị hủy theo thứ tự ngược lại. Ví dụ, hãy xem xét ví dụ sau với các biến số tự động:
{
A a;
B b(a);
} // b.~B() is called, then
// a.~A() is called
Ở đây, b
sử dụng a
. Bằng cách đảm bảo các đối tượng bị phá hủy theo thứ tự ngược lại của công trình xây dựng, C++ giúp quản lý đối tượng suốt đời nhiều hơn dễ dàng hơn.
Trong một lớp, bạn có thể chuyển tham chiếu đến một thành viên dữ liệu khi bạn khởi tạo một thành viên dữ liệu khác. Đảm bảo rằng đối tượng bị phá hủy theo thứ tự ngược lại, bạn sẽ có được những hành vi tương tự như với các biến số tự động:
struct S
{
A a;
B b;
S() : a(), b(a) { }
};
Lưu ý rằng nó thường không phải là một ý tưởng tốt để có dữ liệu các thành viên đề cập đến nhau, nhưng đó là cả hai có thể và đôi khi hữu ích .
Có lẽ nói chính xác hơn khi đối tượng B xuất hiện sau đối tượng A, B có thể giữ tham chiếu đến A. Đối nghịch không đúng, do đó, hủy theo thứ tự ngược lại (B, rồi A) có ý nghĩa, trong khi phá hủy đối tượng A có thể dẫn đến lỗi, vì B có thể giữ một tham chiếu đến nó. – EmeryBerger
@EmeryBerger Vâng, nhưng chỉ vì tham chiếu thành viên trực tiếp phải được khởi tạo khi xây dựng. Nhưng một tham chiếu không phải là hình thức duy nhất của 'tham chiếu': các thành viên được tự do giữ con trỏ với nhau, và những người đó có thể được đặt bất cứ lúc nào, do đó được tự do để được ra khỏi trật tự và trở thành không hợp lệ. Bên cạnh đó, các thành viên có thể giữ các tham chiếu 'thực' với nhau theo thứ tự nếu tham chiếu nói là thành viên của một vùng chứa động như 'std :: vector'. Vì vậy, không thực sự có bất kỳ 'có thể' hoặc 'không thể' về điều này, chỉ cần _should_ và _should not_. Suy nghĩ đúng về cuộc đời là điều thiết yếu bất kể hình thức tham khảo –
Tôi nghĩ có thể bạn đã hiểu lầm. Không phải là thành viên nên bị hủy theo thứ tự này, nhưng họ là được chỉ định.
Có thể quan trọng trong những trường hợp hiếm hoi để biết thứ tự các mục bị hủy.
Ở bất kỳ mức nào, đó là thứ tự các đối tượng bị phá hủy, bạn không thể làm gì với nó nhưng biết rằng đó là những gì đang xảy ra.
Thời gian sống trong C++ được lồng càng nhiều càng tốt. Có thể, mặc dù thường hiếm khi các thành viên dữ liệu phụ thuộc trực tiếp vào nhau (ví dụ: chuyển con trỏ của người khác) hoặc gián tiếp (ví dụ như cả hai đều phụ thuộc vào toàn cục, như viết ra stderr), nhưng ngay cả khi họ không ' t, nó là tốt đẹp để có một thứ tự được chỉ định, và làm tổ phù hợp tốt hơn với cách phần còn lại của ngôn ngữ hoạt động (ví dụ như thời gian sống ở phạm vi chức năng) hơn thứ tự khác sẽ. Tất nhiên, theo quy tắc "as-if" trong tiêu chuẩn, nếu trình biên dịch/thực hiện có thể xác định mã người dùng không thể quan sát việc hủy diệt sắp xếp lại, thì nó có thể làm theo ý thích.
- 1. Vấn đề sao chép dữ liệu Cassandra
- 2. C++: Khởi tạo Thứ tự của các thành viên dữ liệu lớp
- 3. Tai nạn hủy diệt
- 4. Tại sao tín hiệu QObject bị phá hủy được gọi là SAU sự hủy diệt?
- 5. Tại sao trong C# có vấn đề trật tự cho khởi tạo tĩnh?
- 6. C++ căn chỉnh dữ liệu/thứ tự thành viên và thừa kế
- 7. DataContractSerializer: tại sao không xóa thành viên?
- 8. Thành viên của Bản sao thành viên
- 9. Vấn đề với thứ tự độ phân giải constructor
- 10. Tại sao các lớp C++ được phép có các thành viên dữ liệu bằng 0?
- 11. Vấn đề về dữ liệu jQuery
- 12. Vấn đề cơ sở dữ liệu Flask
- 13. Tại sao hàm thành viên const này cho phép biến thành viên bị sửa đổi?
- 14. Tại sao cơ sở dữ liệu quan hệ có vấn đề về khả năng mở rộng?
- 15. thành viên dữ liệu 'vec' không thể là một mẫu thành viên
- 16. Tại sao DateTimeInfo.MonthNames trả lại 13 thành viên?
- 17. phân hủy mất dữ liệu
- 18. Tại sao một lớp không thể có cùng tên cho một hàm và một thành viên dữ liệu?
- 19. tại sao hàm tạo mặc định không có mặt cho một lớp chứa các thành viên dữ liệu const
- 20. Tại sao Hash.new ({}) ẩn thành viên băm?
- 21. Tại sao tôi nên khởi tạo biến thành viên theo thứ tự mà chúng được khai báo?
- 22. css hướng rtl thứ tự nguyên tố vấn đề
- 23. C++ 11 - khai báo thành viên dữ liệu không tĩnh là 'tự động'
- 24. Tại sao <$> chỉ hoạt động trên thành viên thứ hai của một cặp?
- 25. Có giải pháp hiện tại cho vấn đề cấu trúc dữ liệu đa luồng không?
- 26. Tại sao vấn đề gây ra bước nhảy vọt thứ hai?
- 27. Tại sao xác định các thành viên riêng dưới các thành viên công khai trong C++?
- 28. C++ template thành viên tĩnh khởi vấn đề
- 29. C# struct với đối tượng là thành viên dữ liệu
- 30. Vấn đề lưu trữ dữ liệu iOS5. Nơi lưu tệp?
Tôi không nghĩ rằng đây là thực tiễn được đề xuất, nhưng một tuyên bố đơn giản về thực tế: http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.2 – mkb