一个类内部和外部的静态关键字

时间:2012-08-27 23:57:48

标签: c++ static

static关键字一般与内部链接有关,但是类中使用的static关键字有外部链接吗?下面的变量m,n可以在类文件外部访问。

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

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

3 个答案:

答案 0 :(得分:10)

右。

关键字static严重超载,含义太多:

  • 在命名空间范围内的变量或函数上,它给出了名称内部链接。
  • 在类成员上,它使其成为静态成员,不会影响链接。
  • 在函数范围的变量上,它给出变量“静态存储持续时间”而不是“自动”或“动态”存储持续时间(即变量的生命周期延伸到程序的末尾,如全局变量。)

答案 1 :(得分:2)

正如我在my comment中所述,static成员只是与相关联的成员,而不是单个对象。

  

static个成员属于;对于变量,它们可以在没有对象的情况下访问,并在例如实例之间共享。

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

因此Foo::barFoo::fu是合法的。

它们在C ++ 03标准的第9.4节中介绍;

  
      
  1. 类的数据或函数成员可以在类定义中声明为static,在这种情况下,它是类的静态成员

  2.   
  3. 可以使用 qualified-id 表达式static引用类s的{​​{1}}成员X;没有必要使用类成员访问语法(5.2.5)来引用X::s成员。可以使用类成员访问语法引用static成员,在这种情况下, object-expression 将被评估

    static
         

    class process { public: static void reschedule(); }; process& g(); void f() { process::reschedule(); // OK: no object necessary g().reschedule(); // g() is called } 成员可以直接在其类的范围内或在其类的派生类(第10条)的范围内引用;在这种情况下,static成员被称为使用 qualified-id 表达式,并使用嵌套名称说明符 qualified-id 命名引用static成员的类范围。

    static
         

    ...

  4.   

答案 2 :(得分:1)

你可以说静态成员是类的成员而不是任何特定的对象实例。也就是说,它们对所有对象实例都具有相同的值。

静态成员函数虽然没有值,但在其他方面是相同的。它们可以被视为类的一部分,而不是每个对象实例的唯一性。这意味着它们没有this指针,无法访问非静态成员变量。