static

static数据成员

我们通过在成员的声明之前加上关键字static使得其与类关联在一起。和其他成员一样,静态成员可以是public的或private的。静态数据成员的类型可以是常量、引用、指针、类类型等。

一般而言,不能在类的定义中去初始化static数据成员(类内初始化),但是const static int这种类型(只有这种情况才能)能在类内初始化。

static数据成员的初始化不能在头文件中进行,而应该在实现(.cpp)中进行,否则可能会提示重定义。

static数据成员在类外初始化的格式为 type className::variableName = value;。从格式上可以看出,类外初始化不需要使用static关键字。

一个static数据成员只能定义一次。

static成员函数

static成员函数不与任何对象绑定在一起,他们不包含this指针。因此,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针。这一限制既适用于this的显式使用,也对调用非静态成员的隐式使用有效。

当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句(与explicit关键字相同)。

static成员函数的函数体不需使用作用域运算符就能使用静态成员(包括static数据成员和static成员函数)。

static成员函数在类内定义,并放在头文件中,多个源文件包含该头文件不会引起函数名称的重定义。但是如果static成员函数在类内声明,并在同一个头文件内使用类外定义方式定义,如果有多个源文件包含该头文件,将会引起函数名称重定义。因此,如果要类外定义static成员函数,那么需要在源文件中定义,不能在对应的头文件中定义。

static变量的作用域

此处说的static变量,不是属于类的。

static变量又称为全局静态变量,但是这里的全局指的是当前的源文件,而非整个工程。全局变量指的是可以在某个源文件中定义,在其他源文件中使用extern声明并可以使用的变量。而全局静态变量无法使用extern引入到其他源文件中使用。(好好体会一下全局静态变量全局变量所指的作用域。)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

19 + 3 =

8 + = 14