最近一段时间,为找工作,面试的时候被人一顿鄙视。回来的时候就复习了一下基础知识。这里做一些知识点的小结,当做资料,用于以后复习,同时提供给一些像我一样的小菜鸟,当做参考。
static 的相关知识点,均来自网络,论坛。本文写的比较乱,比较杂。如果有错误,或不足,希望各位不小心看到本文的大侠们,指导纠正一下。
一:static变量存储
相对于对堆栈,static变量分配在静态数据区。由于此存储特点,有以下一些应用。
1:全局变量
static 修饰的变量或者函数均为全局变量,但和extern声明不一样
首先 static与extern不能联用。
其次 static修饰的全局变量声明和定义需要同时进行。
再次 static修饰的全局变量只限于本身编译单元。
对于static的使用必须将其定义放在.cpp文件中,.h文件只做声明,来避免对其他模块造成不必要的污染。
2:一份拷贝(这个问题,有很多面试官都会提到)
对于static修饰的类成员变量或者函数,均为属于类的内部实现,属于类定义部分。所以无论类的对象有多少,所有的对象均公用一份内存中的静态成员,即static修饰的变量及函数的拷贝只有一份,所有对象共用。(这个特性可以解决,如怎样才能使的类定义的对象实体只有一个)。使用:声明时候必须给出定义,即分配内存块
a. 初始化
<数据类型><类名>:: <静态成员> = <值>
如 int myclass::mystatic = 0;//在.cpp文件中
b.使用/访问
<类名>::<静态成员变量> 或者像正常变量一样应用如:
myclass::mystatic或者myobjetc.mystatic
二:static成员函数
(这个问题,当时一个面试官问我。我直接傻掉,虽然经常用,但还真不知道相关的知识点。被他一顿鄙视。从那以后我就知道自己有多菜,C++的基础知识基本为0,回来我就啃书了,不过现在依然是个超级菜鸟。要不断学习啊)。
首先,static的成员函数和static的成员变量是一样的,都是类的定义部分,存储在一份共用的静态数据区中
其次,static的成员函数是全局变量,但其作用域限制在本编译单元。
再次,static的成员函数不具有普通成员函数与对象相关联的特性,所以static成员函数不具有隐性的this指针。所以static成员函数无法访问非静态成员变量或者非静态成员函数。也正是这个原因,访问static的成员函数及变量的开销要大于普通成员变量和函数。
对于静态成员函数的访问可以总结为如下几点
1.静态成员可以互相访问,其中包括函数和变量
2.非静态成员可以无限制的访问静态成员
3.静态成员函数不能访问非静态成员函数和非静态成员数据
对static函数的访问可以有二种方式
a : myobject.mystaticfuc()
b : myclass::mystatcifuc()。