C++静态成员与单例模式

首先先了解一下C++类中的静态成员,其实就是在成员变量和成员属性前加static关键字。

1.静态成员变量

通过类创建的所有对象都可以访问这个静态成员变量,它们是共享的。语法是类内声明、类外初始化。初始化的操作不是写在构造函数里的,所以它可以在类外通过类名的方式访问,不一定非要通过对象才可以访问。同时静态成员变量也是有访问权限的。私有静态成员变量属性不可以在类外访问到。

2.静态成员函数

静态成员函数和静态成员变量一样,所有对象都共享同一份函数。值得注意的是静态成员函数内只能访问静态成员变量,不能访问普通成员变量。

3.单例模式是什么?为什么要用到静态成员呢?

单例模式其实就是一个类只能创建一个对象。比如一家公司只有一个打印机可以使用,那么一个公司类只能实例化一个打印机对象,这就是单例模式。

为何要用到静态成员?

当我们正常书写一个类,我们可以通过这个类创建出很多对象,这显然是不符合单例模式规则的。无论我们是在栈上还是堆区创建对象,都会调用构造函数,如果将构造函数私有化,类外就不能创建对象了。但是随之带来了新的问题,现在的类一个对象都创建不了了。

上面说过,静态成员变量可以通过类名的方式访问到,不一定通过创建对象。所以我们在类内public作用域下声明一个静态成员变量,类外是可以访问到的。而且静态成员变量是共享的,符合单例设计模式。

如何创建对象?

通过new的方式,我们可以在堆区创建一个对象指针。所以静态成员变量可以是一个对象指针,然后类外通过new初始化。因为无法创建对象,所以最后我们只能在类外通过类名访问拿到一个对象指针。

进一步改进:

类外拿到的对象指针,我们是可以操作修改的。如果设置为空, 相当于删除了这个对象。

我们可以将静态成员属性设置为私有,然后类内对外提供接口限制读写。提供的接口一般书写为getInstace(),这个函数是静态成员函数,(因为C++中只有静态成员函数才能通过类名访问)返回静态成员属性(对象指针)。最后拿到这个对象只能通过  类名::getInstance()了。

案例代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> //标准输入输出 
#include<string>
using namespace std; // 使用命名空间 


/********* C++代码实践********/
//打印机单例模式
class Printer {
public:
	//对外接口
	static Printer* getInstence() {
		return printer;
	}
	//打印功能
	void printText(string text) {
		cout << text << endl;
	}
private:
	// 构造函数私有化
	Printer() {};
	Printer(const Printer& p) {};
	//类内声明对象指针
	static Printer* printer;
};

//类外初始化
Printer* Printer::printer = new Printer;

int main() {

	Printer* p1 = Printer::getInstence();//拿到打印机对象指针
	p1->printText("hello world");

	system("pause");
	return EXIT_SUCCESS;
}

猜你喜欢

转载自blog.csdn.net/weixin_56067923/article/details/128734122
今日推荐