编程爱好者联盟 2016-09-30
class A{ public: static int count; //静态成员变量 static void get(){}; //静态成员函数 } int A::count=5;static成员变量是类级变量(用来处理这中类型的对象,共享的数据,属于整个类型,内存中只有一份)。和全局变量以及静态局部变量一样,存放在进程的静态存储区(数据区+BSS区)。
静态成员变量必须在类外进行初始化, 不能在构造函数中初始化
静态成员变量类型 类型::静态成员变量名; //基本类型初始化为零 类类型调用无参构造 静态成员变量类型 类名::静态成员变量名=值; 静态成员变量类型 类名::静态成员变量名(值);
#include<iostream> using namespace std; class Person{ string name; int age; static int pcount; //静态成员变量是类型级的变量 public: Person(string name="",int age=1){ this->name=name; this->age=age; cout<<name<<" is coming"<<endl; pcount++; } void show(){ cout<<"I am "<<name<<",age:"<<age<<endl; cout<<"current pcout:"<<pcount<<endl; } ~Person(){ pcount--; cout<<"after "<< name <<" leave,"<<"Current pcount: "<<pcount<<endl; } }; int Person::pcount; void foo(){ Person persona("PuJing",50); persona.show(); Person personb("AoBaMa",45); personb.show(); } int main(){ foo(); //这句执行完里面的对象就被自动析构了 Person personc("XiJinPing",55); personc.show(); return 0; }
只能访问该类的静态成员
class A{ public: static int count; //静态成员变量 static void get(){}; //静态成员函数 } int A::count=5;
Singleton使用私有构造函数的方法禁止在类外部创建实例,而类自己使用静态成员变量的方法来维护其唯一实例,并提供访问该实例的方法。
饿汉式单例模式的优点是加载进程时静态创建单例对象,线程安全;缺点是无论使用与否,总要创建一个实例。
//饿汉式,程序一启动就创建好了对象 class Singleton{ Singleton(){} //构造函数私有化, 保证不能从外部创建对象 static Singleton sig; //static的成员变量, 在进程加载的时候就创建好对象,线程安全 public: static Singleton& getInstance(){ //得到对象的接口, 也是static的, 用来返回唯一的一份sig return sig; } }; Singleton Singleton::sig;
懒汉式单例模式的优点是用则创建,不用不创建,什么时候用什么时候创建;缺点是首次访问时动态创建单例对象,在多线程应用中,存在线程不安全的问题。
//懒汉式,需要时候才创建对象 class Singleton{ Singleton(){} //构造函数私有化 static Singleton* instance; public: static Singleton getInstance(){ if(instance==NULL) instance=new Singleton(); return instance }; } Singleton* Singleton::instance=NULL;
int main(){ Singleton& siga=Singleton::getInstance(); //得到已经在内存中的sig Singleton& sigb=Singleton::getInstance(); cout<<&siga<<":"<<&sigb<<endl; //这两个的地址时一样的, 因为是同一个对象 return 0; }