2011-01-30 17 views

Trả lời

28

No.

thành viên tĩnh không thuộc về các phiên bản của lớp học. chúng không tăng số lượng cá thể và kích cỡ lớp thậm chí 1 bit!

struct A 
{ 
    int i; 
    static int j; 
}; 
struct B 
{ 
    int i; 
}; 
std::cout << (sizeof(A) == sizeof(B)) << std::endl; 

Output:

1 

Đó là, kích thước của AB là chính xác như vậy. các thành viên tĩnh giống như các đối tượng toàn cầu được truy cập thông qua A::j.

Xem trình diễn tại ideone: http://www.ideone.com/YeYxe


$ 9.4.2/1 từ C++ Standard (2003),

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 học. Có chỉ một bản sao của 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 .

$ 9.4.2/3 và 7 từ Standard,

một lần 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 của nó đã được tạo ra.

thành viên dữ liệu tĩnh được khởi tạo và phá hủy chính xác như phi địa phương đối tượng (3.6.2, 3.6.3).

Như tôi đã nói, các thành viên tĩnh giống với các đối tượng toàn cầu hơn!

+1

+1 để liên kết đến các định nghĩa từ tiêu chuẩn, về cơ bản vạch ra câu trả lời trong bê tông. – dcousens

+1

Cảm ơn rất nhiều thông tin –

7

Tiêu chuẩn C++ không thể hiện rõ ràng khi bộ nhớ tĩnh được cấp phát, miễn là nó có sẵn khi sử dụng lần đầu tiên. Điều đó nói rằng, nó rất có thể được phân bổ trong quá trình khởi tạo chương trình, do đó đảm bảo sự hiện diện của nó ngay khi nó được yêu cầu, mà không cần mã đặc biệt để phát hiện và thực hiện phân bổ khi truy cập.

Mục đích của việc đưa dữ liệu tĩnh vào một lớp giống như đặt bất kỳ dữ liệu nào khác vào lớp học. Bằng cách đưa dữ liệu vào một cấu trúc lớp, bạn đang định nghĩa một không gian tên đóng gói, cũng như có thể kiểm soát truy cập bằng cách sử dụng các phương thức accessor và mutator; điều này, đến lượt nó, sẽ cho phép bạn xác nhận hợp lệ dữ liệu đi vào kho lưu trữ bộ nhớ tĩnh, và để đảm bảo tính nhất quán trong suốt quá trình sử dụng dữ liệu này.

+0

Thực ra, tôi nghĩ tiêu chuẩn đối xử với các thành viên tĩnh như tất cả các hình cầu, và sự tiến bộ của họ được gửi đi, theo như tôi hiểu, với cùng một định luật rằng sự tiến hóa của các hình cầu khác. Đó là thứ tự khởi tạo được yêu cầu phải nhất quán trong một đơn vị dịch và không có gì nói về việc ghép kênh với các đơn vị dịch thuật khác. –

-1

Biến tĩnh được lưu trữ trong vùng bộ nhớ đặc biệt được gọi là BSS, trong khi các phiên bản của một lớp được lưu trữ trong một đống hoặc trên một ngăn xếp. Vì vậy, các thành viên tĩnh được lưu trữ riêng biệt.

+7

Thực ra, sự tồn tại của BSS phụ thuộc vào hệ thống. Tiêu chuẩn C++ không xác định bất kỳ con thú nào như vậy, cũng không phải bất kỳ chi tiết nào về việc triển khai phân bổ dữ liệu. –

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