2012-08-27 43 views
6

Từ khóa tĩnh có liên quan đến liên kết nội bộ nói chung, nhưng từ khóa tĩnh được sử dụng bên trong một lớp có liên kết bên ngoài phải không? Các biến m, n bên dưới có thể truy cập được bên ngoài tệp lớp.từ khóa tĩnh bên trong một lớp và bên ngoài nó

class c { 
    int i; 
    int j; 
    static int m; 
    static int n; 

    public: 
    void zap(); 
    static void clear(); 
}; 
+6

'thành viên static' thuộc về lớp * *; đối với các biến, chúng có thể truy cập được mà không cần đối tượng và được chia sẻ giữa các trường hợp, ví dụ: 'struct Foo {static void * bar; tĩnh void * fu(); } ', vì vậy' Foo :: bar' và 'Foo :: fu' là hợp pháp. – oldrinb

+0

Nó không đúng theo yêu cầu của tiêu chuẩn, nhưng có thể (hoặc có thể không!) Giúp suy nghĩ của các thành viên tĩnh như là tĩnh theo ý nghĩa của một địa chỉ cố định thiết lập tại thời gian biên dịch, trong khi dữ liệu thành viên không tĩnh có thể được đặt trên ngăn xếp hoặc đống ở các địa chỉ được xác định thời gian chạy khác nhau. Các thành viên 'static' về cơ bản giống như các biến toàn cầu, ngoại trừ mã định danh của chúng rơi vào phạm vi của lớp khai báo chúng. –

Trả lời

10

Phải.

Từ khóa static là nặng nề quá tải với quá nhiều ý nghĩa khác nhau:

  • Trên một biến hoặc chức năng ở phạm vi không gian tên nó mang lại cho tên liên kết nội bộ.
  • Trên một thành viên của lớp, nó làm cho nó trở thành thành viên tĩnh, không ảnh hưởng đến liên kết. Trên một biến tại phạm vi chức năng, nó cho biến "thời gian lưu trữ tĩnh" thay cho thời gian lưu trữ "tự động" hoặc "động" (nghĩa là tuổi thọ của biến mở rộng đến cuối chương trình, như biến toàn cục.)
+1

Ý nghĩa phi lớp học chủ yếu giống như trong C: http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –

1

Bạn có thể nói rằng các thành viên tĩnh là thành viên của lớp và không phải bất kỳ cá thể đối tượng cụ thể nào. Nghĩa là, chúng có cùng giá trị cho tất cả các cá thể đối tượng.

Chức năng thành viên tĩnh, trong khi không có giá trị, nếu không thì sẽ giống nhau. Thay vì là duy nhất cho mỗi cá thể đối tượng, chúng có thể được xem như là một phần của lớp. Điều này có nghĩa là chúng không có con trỏ this và không thể truy cập các biến thành viên không tĩnh.

+1

Chức năng thành viên thường không được cho là có giá trị *. ;-) – oldrinb

2

Như tôi đã nêu trong các thành viên my comment, static là những thành viên chỉ được liên kết với lớp thay vì các đối tượng riêng lẻ.

static thành viên thuộc về lớp; đối với các biến, chúng có thể truy cập được mà không cần đối tượng và được chia sẻ giữa các trường hợp, ví dụ:

struct Foo { 
    static void *bar; 
    static void *fu(); 
} 

vì vậy Foo::barFoo::fu là hợp pháp.

Chúng được giới thiệu trong § 9.4 của tiêu chuẩn C++ 03;

  1. Một dữ liệu hoặc hàm thành viên của một lớp có thể được khai báo static trong một định nghĩa lớp, trong trường hợp này nó là một tĩnh thành viên của lớp.

  2. Một static viên s của lớp X có thể được gọi bằng cách sử dụng có trình độ-id biểu X::s; không cần sử dụng cú pháp truy cập thành viên của lớp (5.2.5) để chỉ thành viên static.Một thành viên static có thể được gọi bằng cách sử dụng cú pháp truy cập thành viên lớp, trong trường hợp này đối tượng biểu hiện được đánh giá

    class process { 
    public: 
        static void reschedule(); 
    }; 
    process& g(); 
    
    void f() 
    { 
        process::reschedule(); // OK: no object necessary 
        g().reschedule(); // g() is called 
    } 
    

    Một thành viên static có thể được gọi trực tiếp trong phạm vi lớp học hoặc trong phạm vi của một lớp dẫn xuất (khoản 10) từ lớp của nó; trong trường hợp này, thành viên static được gọi là nếu một có trình độ-id biểu đã được sử dụng, với lồng nhau-tên-specifier của có trình độ-id đặt tên cho các phạm vi lớp mà từ đó các static thành viên được tham chiếu.

    int g(); 
    struct X { 
        static int g(); 
    }; 
    struct Y : X { 
        static int i; 
    }; 
    int Y::i = g(); // equivalent to Y::g(); 
    

    ...

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