4

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

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

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

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

4

9 回答 9

11

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在静态方法中使用

动作脚本


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

面向对象设计


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

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

于 2009-03-06T19:36:04.373 回答
5

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

声明一个类方法静态意味着:

  1. 它不能在子类中被覆盖
  2. 它没有指针

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

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

于 2009-03-06T19:44:56.333 回答
2

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

于 2009-03-06T19:05:25.070 回答
2

在 VB.NET 中,Static变量就像 C++ 局部静态变量。

但是,没有全类Static;改为使用Shared

于 2009-03-06T19:17:35.150 回答
2

在 C# 中有 3 种方式可以使用静态关键字:

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

希望这可以帮助。

于 2009-03-06T19:45:38.280 回答
1

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

于 2009-03-06T19:12:54.507 回答
1

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

这有点像其他语言中的私有。排序。

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

于 2009-03-06T19:21:08.743 回答
1

在 VB.NET 中,静态使用过程级别来表示变量与过程的所有执行相关联(它在调用之间保留)。不过,这在面向对象的应用程序中有点神秘。

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

于 2009-03-06T19:30:44.290 回答
0

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

静态方法静态变量静态类型

于 2009-03-06T19:57:41.323 回答