一 static成员变量:
生命周期:从定义开始到进程结束,与类关联,独立于对象。
存储:静态局部变量,静态全局变量都存储在数据段
static修饰的成员变量---先于类的对象而存在(可以直接通过类名使用--前提成员是公有)
static修饰的成员变量--是被这个类的所有对象共用
static修饰的成员变量要在类外初始化 数据类型 类名::变量名 = 值
二 static成员函数:
static修饰成员函数----先于类的对象而存在(可以直接通过类名使用--前提成员是公有)
static修饰的成员函数---该方法没有this指针,在该函数中不能操作非static修饰的成员。
三 (好资料转载,关于static 修饰变量、函数具体知识点讲解)点击
四 单实例模式--使用静态成员变量+静态成员函数
/* 单实例模型实例:封装LCD设备,无论程序在那访问,
都是通过static LcdDevice* sharedLcdDevice() 来获取LCD,从而操作LCD。
*/
#include <iostream>
using namespace std;
class LcdDevice //LCD类
{
public:
static LcdDevice* sharedLcdDevice()//成员方法没有this指针
{
if(instance == NULL)//如果为空则调用构造函数,
//通常整个进程生命周期,因为instance 是静态变量只调用一次。
{
instance = new LcdDevice();
}
return instance;
}
/*把构造函数和拷贝构造函数设置为私有,为了避免下面这两种可以成功调用
LcdDevice mylcd;(声明对象) LcdDevice mylcd=*lcd;(拷贝对象)
我们希望整个程序调用LCD入口只有LcdDevice* lcd = LcdDevice::sharedLcdDevice():
这样保证了我们整个程序操作的是同一个LCD。
*/
private:
LcdDevice()
{
//初始化lcd--open, mmap
}
LcdDevice(LcdDevice& lcd){}
public:
~LcdDevice()
{
//nmap,close
}
void draw_rect()//画矩形模块
{
cout<<"draw rect"<<endl;
}
private:
int fd;
int width, height;
unsigned int *mmp;
static LcdDevice *instance;//数据段
};
//初始化
LcdDevice *LcdDevice::instance = NULL;//静态数据初始化----在数据段分配空间
void fun()//子函数想操作LCD,通过这样的方式,与main() 操作LCD 可以同步.
{
//绘图
LcdDevice* lcd = LcdDevice::sharedLcdDevice();
lcd->draw_rect();
}
int main(void)
{
LcdDevice *lcd = LcdDevice::sharedLcdDevice();
lcd->draw_rect();
fun();
//LcdDevice mylcd; 该方式不合适。
//LcdDevice mylcd=*lcd;该方式不合理
}