class Singleton
{
//其他成员
private:
Singleton(){ cout << "Hello Singleton!" << endl; }//私有构造函数
Singleton(const Singleton &);//拷贝构造函数,只声明不定义,这要当用户或友元想要拷贝构造该类的已存在实例时会出错。
Singleton & operator= (const Singleton &);//赋值运算符,只声明不定义,作用同上
public:
//只有在调用Singleton ::getInstance()时,实例才会被创建(按需创建),而且只会创建一个实例
//该实现是线程安全的,因为不需要先判断是否已存在该类的实例,再决定是否创建实例这样的分步操作(因为如果两个线程同时运行到判断instance是否存在的if语句,并且instance的确没有创建是,那么两个线程都会创建一个实例,此时就不再满足单例模式的要求了。)
static Singleton *getInstance(){
static Singleton instance;//静态局部变量,只初始化一次,而且在程序运行结束时会自动调用该变量的析构函数对其进行析构
return &instance;//返回该实例的指针。
}
void display(){ cout <<"I'm display. i =" << i << endl; }//for test
int i;//for test
};
int main(void){
cout << "main start" << endl;
Singleton *a = Singleton::getInstance();
a->i = 1;
// Singleton b = *a;//error:无法访问private成员
Singleton &b = *a;
b.display();
a->display();
b.i = 2;
b.display();
a->display();
return 0;
}
注:如果getInstance返回的是引用,则用户代码的调用方式也应改为引用方式:
Singleton &a = Singleton::getInstance();