静态成员变量,静态成员函数,单例模式

编程爱好者联盟 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;
  1. Static Member Function没有this指针,只能访问该类Static Member Variable,不能访问普通成员变量。
  2. NonStatic Member Function非静态成员函数都可以访问。

单例模式

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;
}

相关推荐