2013-03-05 14 views
15

tôi đang tìm ra cách để khởi tạo bản đồ tĩnh trong C++ và tìm thấy mã này:tại sao "tĩnh" có thể không được sử dụng khi xác định (trái với tuyên bố) một thành viên dữ liệu tĩnh "?

struct A{ 
static map<int,int> create_map() 
    { 
     map<int,int> m; 
     m[1] = 2; 
     m[3] = 4; 
     m[5] = 6; 
     return m; 
    } 
static const map<int,int> myMap; 

}; 

const map<int,int> A:: myMap = A::create_map(); 

Tuy nhiên, nếu tôi thay đổi dòng cuối cùng để

const static map<int,int> A:: myMap = A::create_map(); 

khiếu nại Compiler: 'tĩnh' có thể không được sử dụng khi xác định (trái ngược với tuyên bố) thành viên dữ liệu tĩnh "?

Tôi tự hỏi tại sao? Logic hoặc lý do đằng sau điều này là gì?

Trả lời

15
static int a = 0; // grandfathered and still useful, provides static *LINKAGE* 
        // and static STORAGE DURATION 
static int X::a = 0; // confusing and illegal, is it static LINKAGE 
        // or static STORAGE DURATION 
        // or static MEMBERSHIP? 

static đã có ý nghĩa (trong C) khi được sử dụng trên định nghĩa biến. Nó sẽ rất đáng ngạc nhiên cho các lập trình viên C học C++ để thấy rằng ý nghĩa đã được thay đổi đôi khi, nhưng không phải lúc nào cũng vậy.

Vì vậy, ý nghĩa mới (thành viên tĩnh) chỉ hoạt động bên trong định nghĩa lớp (trong đó C không cho phép từ khóa static).

3

Không có gì khác biệt so với

struct A 
{ 
    static int x; 
} 

int A::x;   //legal 
static int A::x; //illegal 

Mọi thứ khác chỉ là nhiều từ khóa ném vào tối thiểu, khái niệm giống nhau, ví dụ này. Thành viên static chỉ có thể được khai báo static bên trong định nghĩa lớp học.

Các

const map<int,int> A:: myMap = A::create_map(); 

bên ngoài lớp học chỉ là một định nghĩa của static viên A::myMap. Thêm static không có ý nghĩa ở đó.

Lý do đằng sau điều này có lẽ là để tránh nhầm lẫn - một biến số tự do là một biến "riêng tư" (với đơn vị dịch). Một thành viên static là đối diện.

2

Khai báo một thành viên trong lớp static có nghĩa là nó được chia sẻ giữa tất cả các đối tượng của lớp này.

Khi bạn thêm static vào định nghĩa biến bên ngoài một lớp, điều đó có nghĩa là biến này có phạm vi tệp và không hiển thị bên ngoài tệp này.

Nếu nó sẽ được phép

const static map<int,int> A:: myMap = A::create_map(); 

điều này có nghĩa, bạn có một biến thành viên tĩnh, mà không phải là bên ngoài có thể nhìn thấy các tập tin này. Điều này không có ý nghĩa.

+0

hoặc người nào khác có nghĩa là thành viên tĩnh, điều này sẽ không nhất quán. –

+0

@BenVoigt không thể, tĩnh cho thành viên có dư thừa - bạn không thể xác định thành viên không tĩnh theo cách này. – Slava

+0

@ Slava: Hoàn toàn đúng, nó sẽ không phù hợp và dư thừa, vì vậy hai lý do chính đáng để cấm nó. Nhưng tôi không nghĩ rằng câu hỏi đã được suy nghĩ của liên kết tĩnh. –