静态的不同语言

时间:2009-03-06 19:02:27

标签: programming-languages static keyword

我听说语言之间关于关键字 static 的含义存在差异,但我找不到合并这些差异的好列表。

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

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

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

9 个答案:

答案 0 :(得分:10)

<强> 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指针
  • 非静态成员可以访问任何静态成员
  • 在文件级别对象具有内部链接,但具有类范围的类成员
  • 除外
  • 类成员需要在类声明中定义,或者通过类名和作用域解析运算符
  • 明确定义
  • 无法在静态方法中使用this

<强>的ActionScript


  • C ++中的类方法
  • 无法在静态方法中使用thissuper
  • 仅通过班级名称而非实例名称访问
  • 未继承
  • 派生类可以访问base的静态属性
  • 必须在声明常量
  • 的同时初始化使用static和const关键字声明的变量

面向对象设计


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

我可能已经错过了很多其他的东西 - 随意填写。

答案 1 :(得分:5)

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

声明类方法 static 意味着:

  1. 无法在子类中重写
  2. 它没有自我指针
  3. 这意味着静态类方法只能访问其定义的类中的类成员,而普通的类方法可以访问派生类中的重写类成员。

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

答案 2 :(得分:2)

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

但是,没有全班Static;请改用Shared

答案 3 :(得分:2)

在C#中,有三种方法可以使用静态关键字:

  • 在类定义上,这意味着该类只会暴露静态成员而不能实现
  • 在类成员上,这意味着可以调用该成员而无需实例化该类。
  • 在构造函数上,这意味着在调用静态成员之前,将始终调用静态构造函数。 (这些主要是性能瓶颈因此不推荐)

希望这会有所帮助。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

在其他语言中有点像私人。几分。

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

答案 7 :(得分:1)

在VB.NET中,静态使用过程级别来表示变量与过程的所有执行相关联(它从调用到调用保留)。这虽然是面向对象应用程序中的一种神秘用法。

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

答案 8 :(得分:0)

维基百科总结了static的许多不同含义:

Static Methodsstatic variablesstatic typing