利用c++的private和static实现单例模式

精髓就是 将构造函数设置为private属性,并且将复制构造函数和赋值构造函数也设置为private属性,这样的话,就无法在外部创建对象,所以此时还需要一个public的函数:getHumanInterface(),这个函数来调用private属性的构造函数来生成我们需要的对象,并且将这个对象设置为static属性,设置为static属性的目的是:static属性的对象是放在全局变量区的,这样的话,每次调用这个getHumanInterface的时候,访问的是同一个变量,这样也就实现了我们需要的 单例模式;

/*********************** Human.h *******************************/
#include <string>

/*这里使用了static关键字:
* static用于类的数据成员时,该数据成员在所有对象之间共享
* static用于在函数内部声明局部变量时,该变量的值两次调用之间,值不变
* static用于成员函数时,该函数在所有成员之间共享
*/

/*构造函数,复制构造函数,赋值操作符,都声明为private成员,保证了对象创建的唯一性*/
class Human {
private:
	Human();

	//通过下面的两处声明,将复制构造函数和赋值构造函数设置为了private属性;
	Human(const Human& Source); //复制(拷贝)构造函数
	const Human& operator=(const Human&); // 赋值构造函数;

public:
	static Human& getHumanInterface();  //static函数,不用创建类,便可在外部访问
};


/****************************Human.cpp*****************************/
#include <iostream>
#include <string>
#include "human.h"

/*构造函数(创建对象时被调用)*/
Human::Human()
{
	std::cout << "call the Human() constructor" << std::endl;
}

/*类方法的实现*/
Human& Human::getHumanInterface()
{
	static Human onlyHuman;  //两次访问之间值不变
	return onlyHuman;
}


/*****************************main.cpp*******************************/
#include <iostream>
#include "human.h"

using namespace std;

/*可以利用private和static,实现单例模式,只能创建一个对象,多次创建仍然是此对象*/
int main()
{
	Human& onlyMan = Human::getHumanInterface(); //通过类的static函数(未创建对象便可调用),得到一个对象,
	//Human woman;  //栈上创建对象,编译出错,因为构造函数为private成员,外部不可访问
	//Human* woman = new Human; //堆上创建对象,编译出错,因为构造函数为private成员,外部不可访问
	//Human woman = onlyMan; //复制对象,编译出错,因为复制构造函数为private成员,外部不可访问
	//Human woman = Human::getHumanInterface(); //编译出错,此处使用的是复制构造函数,
	                                            //而复制构造函数是private属性,外部不可访问
	return 0;
}

参考:C++ private,static和构造函数实现单例模式

猜你喜欢

转载自blog.csdn.net/baidu_35679960/article/details/84201410