代码之家  ›  专栏  ›  技术社区  ›  Scottie T

不同语言的静态

  •  4
  • Scottie T  · 技术社区  · 16 年前

    我听说两种语言对关键词的含义有差别 static 但我还没有找到一个能消除这些差异的好清单。

    这就是我所知道的 静止的 在C++中:

    • 对于函数内的局部静态变量,变量在启动时初始化,并在函数调用之间保存该值。
    • 静态数据成员在类的所有实例之间共享。换句话说,静态数据成员只有一个实例。静态数据成员必须在文件范围内初始化。
    • 静态成员函数只能访问静态成员。
    • 在递归代码中,静态对象或变量保证在代码块的不同实例中具有相同的状态。
    • 在文件范围内定义的静态对象和变量只有内部链接。其他文件不得使用。

    什么意思 静止的 其他语言的变化?

    9 回复  |  直到 6 年前
        1
  •  9
  •   dirkgently    16 年前

    C


    • 关键字可以更改对象的链接或持续时间(生存期)。
    • 变量始终初始化为0
    • 功能具有内部链接。
    • 如果在文件级作用域中声明:变量具有内部链接和静态持续时间(即在程序的整个生命周期中都存在)
    • 如果在块范围中声明:变量没有链接,但有静态持续时间
    • 在一个翻译单元中,同一静态变量可以有多个声明。但是,请注意,它们必须相同。例如:在文件级范围:

    int a;        // a has external linkage
    
    static int a; // a now has static linkage
                  // same as if you wrote: static int a = 0;
    
    //...
    
    static int b; // static linkage
    
    extern int b; // extern loses its meaning, b still has internal linkage
    
    //...
    
    extern int b; // b has external linkage
    
    static int b; // error
    
    //...
    
    void func() {
      static int x; // automatic linkage, static duration
                    // same as if you wrote: static int x = 0;
    }
    

    C++


    • 在文件级范围内,变量和成员的用法已被弃用,取而代之的是匿名命名空间。仅作为兼容性存在
    • 变量仍然得到默认值初始化(如在C中)为0
    • “6.7所有具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的本地对象的零初始化(8.5)在任何其他初始化发生之前执行[…]”
    • 变量具有静态存储持续时间,除非伴有 thread_local 说明符(从C++ 0x开始)
    • 翻译单元中只能有一个静态定义
    • 成员变量/函数意味着它们是类的属性,而不是实例的属性 合法访问语法:instance.property或class::property
    • 静态成员函数只能访问静态成员变量 不 this 此类函数的指针
    • 但是,非静态成员可以访问任何静态成员
    • 在文件级,对象具有内部链接,但具有类作用域的类成员除外。
    • 类成员需要在类声明中或通过类名称和作用域解析运算符显式定义在外部。
    • 不能使用 在静态方法中

    动作脚本


    • C++中的类方法
    • 不能使用 super 在静态方法中
    • 只能通过类名而不是实例名访问
    • 非继承的
    • 然而,派生类可以访问基的静态属性
    • 用static和const关键字声明的变量必须在声明常量的同时初始化。

    围绕目标进行的设计


    • 单件设计模式被许多人视为美化的静态对象。
    • 用于工厂设计模式

    我可能错过了很多其他的事情——随便插手吧。

        2
  •  5
  •   Kromster Satyajit    6 年前

    在Delphi中,静态关键字专门用于定义类方法。在Delphi A中 正常的 类方法可以声明为虚方法并在子类中重写。另外,Delphi还有一个 自己 变量,类似于 其他语言的指针。但是在类方法中, 自己 指向调用方法而不是实例的类。

    声明类方法 静止的 手段:

    1. 它不能在子类中被重写
    2. 它没有 自己 指针

    这意味着静态类方法只能访问在其中定义的类中的类成员,而普通类方法可以访问派生类中被重写的类成员。

    Delphi文档中还有其他非正式的静态用法,通常指的是特性不可更改性(这是一个词吗?)例如静态数组与动态数组。除非另有声明,否则Delphi中的所有实例方法都是静态的。

        3
  •  2
  •   Powerlord    16 年前

    在VB.NET中,A Static 变量就像C++本地静态变量一样。

    但是,没有全班的 静态的 使用 Shared 相反。

        4
  •  2
  •   Jeroen Landheer    16 年前

    在C中,静态关键字有三种使用方式:

    • 在类定义上,这意味着类只公开静态成员,不能声明
    • 在类成员上,这意味着可以调用该成员而不必声明类。
    • 在构造函数上,这意味着在调用静态成员之前,将始终调用静态构造函数。(这些主要是性能瓶颈,因此不推荐使用)

    希望这有帮助。

        5
  •  1
  •   Jon Skeet    16 年前

    在C中,它几乎总是意味着:“与类型相关,而不是与类型的实例相关”。

        6
  •  1
  •   SingleNegationElimination    16 年前

    python有decorator@staticmethod,当它应用于类成员时,会使该方法在类上而不是实例上可用,并且不会向该方法传递自动参数。@classmethod修饰符执行类似的函数,但将类作为第一个参数传递,使其更有用。

        7
  •  1
  •   Patrick    16 年前

    在C语言中,静态将函数或全局变量标记为其所在文件的本地变量。

    它在其他语言中有点像私人语言。索塔

    如果它在一个函数中,那么静态会将该变量预分配到二进制文件的数据部分,而不是在运行时在堆栈上。

        8
  •  1
  •   Eric Nicholson    16 年前

    在vb.net中,static用于过程级别,表示变量与过程的所有执行相关联(从调用到调用都会保留该变量)。不过,在面向对象的应用程序中,这有点晦涩。

    对应项是“共享的”,这意味着方法或成员是类型级别的(您不需要实例来访问它)。

        9
  •  0
  •   Ben S    16 年前

    维基百科总结了 static :

    Static Methods , static variables , static typing .