一.static(file static)文件内静态定义
未命名的命名空间取代文件中的静态声明:
在标准C++引入命名空间的概念之前,程序需要将名字声明成static的以使其对于整个文件有效。在文件中进行静态声明的做法是从C语言继承而来的。在C语言中,声明为static的全局实体在其他文件外不可见。
warning:在文件中进行静态声明的做法已经被C++标准取消了,现在的做法是使用未命名的命名空间,如下:
namespace {
int i;
}
等价于 static int 1;
二.static member (静态成员)
1.类的静态成员
有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。静态成员函数不与任何对象绑定在一起,它们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针。这一限制既适用于this的显示使用,也对调用非静态成员的隐式使用有效。
2.定义静态成员
因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着它们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一个静态成员只能定义一次
doubel Account::i = inti(); //要想确保对象只定义一次,最好的办法是把静态数据成员的定义与其他非内敛函数的定义放在同一个文件中。
即使一个常量静态数据成员在类内部被初始化了,通常情况下也应该在类的外部定义一下该成员:
constexpr int A::i; //一个不带初始值得静态成员的定义。
静态成员可以是不完全类型;静态成员可以作为默认实参。
3.类模板的static成员
//为了通过类来直接访问static成员,我们必须引用一个特定的实例:
Foo<int> fi;
auto ct = FOO<int>::count();
ct = fi.count();
4.继承与静态成员
如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。不论从基类中派生出来多个派生类,对于每个静态成员来说只存在唯一的实例。
5.嵌套类的静态成员定义
如果嵌套类声明了一个静态成员,则该成员的定义将位于嵌套类型的作用域之外。例如,假设A有一个静态成员:
int B::A::i = 1;
三.局部静态对象
某些时候,有必要令局部变量的声明周期贯穿函数调用及之后的时间,可以将局部变量定义成static类型从而获得这样的对象。局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。