6

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

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

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

3 回答 3

10

正确的。

该关键字static严重超载,具有太多不同的含义:

  • 在命名空间范围内的变量或函数上,它给出了名称内部链接。
  • 在类成员上,它使其成为静态成员,这不会影响链接。
  • 在函数范围内的变量上,它为变量提供“静态存储持续时间”,而不是“自动”或“动态”存储持续时间(即变量的生命周期延伸到程序的末尾,就像全局变量一样。)
于 2012-08-28T00:09:21.083 回答
2

正如我在评论中所说,static成员是仅与相关联的成员,而不是与单个对象相关联的成员。

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

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

所以Foo::bar并且Foo::fu是合法的。

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

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

  2. 可以使用qualified-id表达式来引用类的static成员;不必使用类成员访问语法 (5.2.5) 来引用成员。可以使用类成员访问语法来引用成员,在这种情况下,对象表达式被评估sXX::sstaticstatic

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

    成员可以在static其类的范围内或在从其类派生的类的范围内(第 10 条)直接引用;在这种情况下,static成员被引用就好像使用了限定 ID表达式,限定 ID 的嵌套名称说明符命名了引用该成员的类范围。static

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

    ...

于 2012-08-28T00:14:23.003 回答
1

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

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

于 2012-08-28T00:02:35.187 回答