C++实现单例模式

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值