Programming languages 不同语言中的静态

Programming languages 不同语言中的静态,programming-languages,static,keyword,Programming Languages,Static,Keyword,我听说不同语言在关键字static的含义上存在差异,但我还没有找到一个好的列表来整合这些差异 以下是我对C++中静态的含义的了解: 对于函数中的局部静态变量,变量在启动时初始化,值在函数调用中保存 静态数据成员在类的所有实例之间共享。换句话说,静态数据成员只有一个实例。静态数据成员必须在文件范围内初始化 静态成员函数只能访问静态成员 在递归代码中,静态对象或变量保证在代码块的不同实例中具有相同的状态 在文件范围内定义的静态对象和变量只有内部链接。其他文件不能使用它们 static在其他语言中

我听说不同语言在关键字
static
的含义上存在差异,但我还没有找到一个好的列表来整合这些差异

以下是我对C++中静态
的含义的了解:

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

static
在其他语言中的含义是如何变化的?

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

Python有decorator@staticmethod,当应用于类成员时,使该方法在类而不是实例上可用,并且不向方法传递自动参数。@ CaseMead DealPoor执行类似的函数,但将类作为第一个参数传递,使其更有用。V/B.NET中的

,<代码>静态< /COD>变量就像C++本地静态变量。


但是,没有类范围的
静态
;改为使用
Shared

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

这有点像其他语言中的隐私。索塔


如果它在函数中,那么static会在二进制文件的数据段中预先分配该变量,而不是在运行时在堆栈上。

在VB.NET中,static用于过程级,表示该变量与过程的所有执行相关联(在调用之间保留)。不过,这在面向对象的应用程序中有点晦涩难懂

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

C


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

C++


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

动作脚本


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

面向对象设计


  • 许多人认为单例设计模式是一个美化的静态对象
  • 用于工厂设计模式


我可能错过了很多其他的东西——请随意插嘴。

在Delphi中,static关键字专门用于定义类方法。在Delphi中,一个普通的类方法可以声明为虚拟的,并在子类中重写。此外,Delphi还有一个自变量,类似于其他语言中的this指针。然而,在类方法中,self指向调用该方法的类,而不是实例

声明类方法静态意味着:

  • 不能在子类中重写它
  • 它没有自指针
  • 这意味着静态类方法只能访问它在中定义的类中的类成员,而普通类方法可以访问派生类中被重写的类成员

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

    在C#中有
    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;
    }