我听说关于关键字含义的语言之间存在差异static
,但我没有找到一个合并这些差异的好列表.
以下是我对static
C++中的含义的了解:
对于函数内的局部静态变量,变量在启动时初始化,并且值跨函数调用保存.
静态数据成员在类的所有实例之间共享.换句话说,只有一个静态数据成员的实例.必须在文件范围初始化静态数据成员.
静态成员函数只能访问静态成员.
在递归代码中,保证静态对象或变量在代码块的不同实例中具有相同的状态.
在文件范围定义的静态对象和变量仅具有内部链接.没有其他文件可以使用它们.
static
其他语言的变化意义如何?
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开始)
翻译单元中只能有一个静态定义
成员变量/函数意味着它们是类的属性而不是实例Legal访问语法:instance.property或Class :: property
静态成员函数只能访问静态成员变量没有this
指针用于此类函数
但是,非静态成员可以访问任何静态成员
在文件级别,对象具有内部链接,但具有类范围的类成员除外
类成员需要在类声明中定义,或者通过类名和作用域解析运算符明确定义
不能this
在静态方法中使用
动作脚本
C++中的类方法
不能使用this
或super
在静态方法
仅通过类名而不是实例名访问
没有继承
但派生类可以访问base的静态属性
必须在声明常量的同时初始化使用static和const关键字声明的变量
面向对象设计
Singleton设计模式被许多人认为是一个美化的静态对象
用于工厂设计模式
我可能错过了很多其他的东西 - 随意插入.
在Delphi中,static关键字专门用于定义类方法.在Delphi中,可以将普通类方法声明为虚拟并在子类中重写.另外Delphi有一个自变量,类似于其他语言中的this指针.但是在类方法中,self指向调用方法的类而不是实例.
声明类方法static意味着:
它不能在子类中重写
它没有自我指针
这意味着静态类方法只能访问其定义的类中的类成员,而普通类方法可以访问派生类中的重写类成员.
在Delphi文档中还有其他非正式的静态用法,通常指的是一个不可加入的特征(是一个单词?).例如静态数组与动态数组.除非另有声明,否则Delphi中的所有实例方法都是静态的