2010-05-24 30 views
12

Nói rằng tôi có:Một destructor có phá hủy một thành viên tĩnh không?

class A 
{ 
    A() 
    {} 
    ~A() 
    {} 
}; 

class B 
{ 
public: 
    B() 
    {} 
    ~B() 
    {} 
private: 
    static A mA; 
}; 

B* pB = new B; 
delete pB; 

Khi tôi gọi xóa PB, destructor của B sẽ được gọi. Điều này sau đó sẽ gọi destructor cho thành viên tĩnh A?

+1

có thể câu hỏi của bạn là "Khi thành viên tĩnh bị hủy"? –

Trả lời

22

Từ khóa tĩnh có nghĩa là biến độc lập với các phiên bản. Đó là lý do tại sao bạn có thể truy cập các biến tĩnh và các phương thức mà không instantiating một đối tượng từ lớp ở nơi đầu tiên. Đó là lý do tại sao phá hủy một cá thể sẽ không ảnh hưởng đến bất kỳ biến tĩnh nào.

12

Tất nhiên là không. Trước hết, bạn đã xác định một destructor rỗng rõ ràng. Và nếu destructor mặc định đã làm điều đó, bạn không bao giờ có thể phá hủy các trường hợp mà không có rủi ro làm cho lớp không sử dụng được.

+2

Sự tồn tại của một destructor rỗng rõ ràng không thực sự quan trọng. –

1

Đối tượng có tuổi thọ tĩnh sẽ bị hủy khi ứng dụng chấm dứt. Trong số các đối tượng tĩnh khác nhau có thể có trong chương trình, các destructors được gọi theo thứ tự ngược lại về cách các đối tượng được xây dựng.

Việc xây dựng/hủy các đối tượng đối tượng không ảnh hưởng đến thời điểm thành viên tĩnh được xây dựng hoặc hủy.

1

Thành viên tĩnh không sống trong không gian bộ nhớ được chỉ định cho một phiên bản của lớp học. Do đó, nó sẽ không bị xóa hoặc hủy bỏ trừ khi bạn làm điều đó một cách rõ ràng trong bất kỳ phần nào của mã của bạn (bao gồm cả destructor lớp, nhưng logic mã của bạn phải xử lý khả năng có nhiều phiên bản ...)

1

Static biến còn được gọi là biến lớp. Điều này trái ngược với các biến mẫu. Như các tên này ngụ ý, các biến lớp liên quan đến toàn bộ lớp, trong đó các biến mẫu thuộc về một cá thể. Người ta có thể lấy được tuổi thọ của các biến này dựa trên những sự kiện này.

Một cách khác để xem xét giả định này gọi hàm hủy thực sự phá hủy các biến tĩnh. Hãy tưởng tượng sau đó hậu quả của một đối tượng được khởi tạo và sau đó bị xóa. Điều gì sẽ xảy ra các biến tĩnh được chia sẻ bởi tất cả các đối tượng khác của lớp mà vẫn đang được sử dụng.

7

C++ chuẩn 03, 9.4.2 tĩnh dữ liệu thành viên:

Một thành viên dữ liệu tĩnh không phải là một phần của các subobjects của một lớp. Có chỉ một bản sao của một thành viên dữ liệu tĩnh được chia sẻ bởi tất cả các đối tượng của lớp học .

Thành viên dữ liệu tĩnh không phải là một phần của lớp - do đó nó không liên quan đến tuổi thọ của lớp học cũng như lúc xây dựng hoặc hủy.

Xây dựng (9.4.2/3)

Khi các thành viên dữ liệu tĩnh đã xác định, nó tồn tại ngay cả khi không có đối tượng của lớp mình đã created.of lớp của nó đã được tạo ra .

Destruction (9.4.2/7)

Thành phần dữ liệu tĩnh được khởi tạo và hủy chính xác như đối tượng không phải cục bộ.

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