C++关键字 ---- static

昨天看书看到了这一部分,感觉书上总结的很好。把我之前的认知成功的串联了一遍,也填补了很多不曾注意到的空白。以下总结内容参考《王道程序员求职宝典》,很不错的一本书,内容比较全面,还有搭配的真题训练很不错,认真看一遍受益很大。

一、static的作用

不考虑类的话,static的作用可以分为三条。

1.隐藏

  • 当我们同时编译多个文件时,所有未加static前缀的全局变量函数都具有全局可见性。
  • 如果加了static,就会对其他源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
  • static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量来说,static还有以下两个作用。

2.默认初始化为0

  • 该作用包括未初始化的全局静态变量与局部静态变量。其实未初始化的全局变量也具备这一特性。因为未初始化的全局变量与局部静态变量是存储在同一块区域内的BSS段的。
  • 有些时候利用这一特性可以减少工作量,比如初始化一个稀疏矩阵,可以省去将所有元素置0的操作,直接声明为静态变量。

3.保持局部变量内容的持久

  • 函数内的局部变量,调用时存在,退出函数就消失了,但静态局部变量不一样,它存在于静态存储区(DATA或者BSS段),因而即使函数栈消失,它的内容依旧存在。而且静态变量只进行一次初始化。
  • 静态局部变量的生存期虽然为整个源程序,但是其作用域仍然与局部变量相同,即只能在定义该变量的函数内使用该变量,在退出函数时,该变量虽然依旧存在,但是无法调用它。

二、类中static的作用

C++中重用了该关键字,并赋予它与前面不同的含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。static成员可以是函数或数据,都独立于类类型的对象而存在。static在类中的作用,需要详细的去理解体会,可能定义的比较详细,需要逐字品读。

1.静态数据成员

  • 在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。通常,非static数据成员存在于每个类类型的对象中。不像普通数据成员,static数据成员独立于该类的任意对象而存在。
  • 每个static数据成员是与类关联的对象,并不与该类的对象相关联,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其他所有实例所见。
  • 静态数据成员和普通数据成员一样遵从public、protected、private访问规则。
  • 静态数据成员也存储在全局存储区。静态数据成员定义时需要分配空间,所以不能再类声明中定义。static数据成员必须在类定义体外定义。但是有个例外,就是const static数据成员是可以在类的定义体中进行初始化的。
  • 静态成员是属于类的,不属于任何一个对象,但是被每一个对象共享,可以直接用类名调用,是一份共享数据。

2.静态成员函数

  • 静态成员函数与静态数据成员一样,属于类的一部分,为类服务而不为某一个类的具体对象服务。

  • 因为普通的成员函数总是具体的属于某一个类的具体对象,所以普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身。

  • 但是与普通成员函数相比,静态成员函数由于不与任何的对象关联,因此它不具有this指针。因而它无法访问属于对象的非静态数据成员也无法访问非静态成员函数,它只能调用其余的静态成员函数和访问静态数据成员。

  • 因为static成员不是任何对象的组成部分,所以static成员函数不能被声明为const。毕竟,将成员函数声明为const就是承诺不会修改该函数所属的对象,而static成员函数不属于任何对象。

  • static成员函数也不能被声明为虚函数、volatile。

  • 关于静态成员函数,可以做一下总结

    • 1.静态成员之间可以互相访问,包括静态成员函数访问静态成员函数和访问静态数据成员。静态成员函数不能访问非静态成员函数和非静态数据成员,非静态成员函数可以任意的访问静态成员函数和静态数据成员。
    • 2.由于没有this指针的额外开销,因此静态成员函数与类的非静态成员函数相比速度上会有少许的增长。

你可能感兴趣的:(C++,数据结构)