2011-01-15 31 views
5

Tôi có một biến tĩnh trong lớp. Tôi đang khởi tạo điều đó trong phạm vi toàn cầu, nó hoạt động tốt.Khởi tạo biến lớp tĩnh bên trong chính

Nhưng Khi tôi cố gắng Khởi tạo trong trình liên kết chính sẽ phát ra lỗi. Tại sao lại như vậy.

class Myclass{ 

    static int iCount; 
} ; 

int main(){ 

    int Myclass::iCount=1; 

} 

Và Trong phạm vi toàn cầu do tại sao tôi phải xác định loại biến như

int Myclass::iCount=1; 

Như Trong lớp học của tôi Tôi definig iCount as type nguyên tại sao không.

Myclass::iCount =1 ; in //Global scope 
+0

@goreSplatter: 'Myclass :: iCount' không công khai, nó sẽ thất bại. – peoro

+0

@goreSplatter: Những gì @peoro cho biết, nhưng ngay cả khi nó được công khai, đó sẽ là một * chuyển nhượng * không và * initialisation * – Clifford

+0

@peoro: * khởi tạo * của các thành viên dữ liệu tĩnh tư nhân không thất bại !! các truy cập khác, như * assignment *, sẽ không thành công. – Nawaz

Trả lời

5

Phần $ 9.4.2/7 từ ++ Chuẩn C nói,

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

Lưu ý các cụm từ "khởi tạo""giống hệt như đối tượng phi địa phương". Hy vọng rằng giải thích tại sao bạn không thể làm điều đó.

Thực tế, 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 Myclass::iCount. Vì vậy, bạn đã khởi tạo chúng ở phạm vi toàn cầu (phạm vi cùng một lúc mà lớp được định nghĩa), như thế này:

class Myclass{ 

    static int iCount; 
} ; 
int Myclass::iCount=1; 

int main(){ 
    /*** use Myclass::iCount here ****/ 
} 

tương tự chủ đề:

How do static member variables affect object size?

3

Vì cú pháp C++ không cho phép điều này. Bạn cần khởi tạo biến tĩnh của mình bên ngoài phạm vi của một số hàm.

Bên cạnh đó bạn quên dấu chấm phẩy ; sau khi kết thúc khung của lớp học.

3

đây là C++ chính xác. Bên ngoài một hàm, trong một tệp cpp. việc khởi tạo được thực hiện ngay từ đầu/khởi chạy của tệp thực thi. (thậm chí trước khi gọi chính());

//main.h 

class Myclass{ 

    static int iCount; 
}; // and don't forget this ";" after a class declaration 


//main.cpp 

int Myclass::iCount=1; 

int main(){ 



} 
1

Các khởi động tĩnh xảy ra trước chính được gọi là khởi tạo thời gian chạy.

Đặt nó trong một hàm không được phép vì đó là nơi các đối tượng được dò tìm tại địa phương được khai báo. Nó sẽ gây nhầm lẫn và mơ hồ để cho phép điều đó.

2

Từ tiêu chuẩn C++ (§8.5/10):

An initializer for a static member is in the scope of the member’s class.

lớp Myclass có phạm vi toàn cầu và bạn đã cố gắng để khởi tạo thành viên tĩnh của nó trong phạm vi hẹp hơn - của hàm main.

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