P29单例模式

1.打印机,单例模式,

无论创建多少个打印机,办公室只有一次打印机,无论谁发起打印任务,都会被计数。

而不是一个人打印了3次,另一个人重新计数。

我还没弄明白疑点:

为什么静态成员变量 (成员变量俗称类的属性)private了,还居然能在外面给它设置了

// P29-0806打印机单例模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//这里例子记住了但是不知道为啥,静态属性即使设置了private 居然外面还能访问到

#include <iostream>
#include <string>
using namespace std;

//
//class Myprinter
//{
//public:
//	void printext(string str) {
//		cout << str << endl;
//	}
//
//	一开始把它写在 public 这样谁都过来改正,改成false怎么办
//	static Myprinter* priptr;
//private:
//
//	static Myprinter* priptr;
//	Myprinter() {
//		cout << "构造函数私有" << endl;
//
//	}
//
//};
//
//Myprinter::priptr 从public改成private之后,这行就完蛋了,因为访问不到了
//Myprinter* Myprinter::priptr = new Myprinter;
//
//void test() {
//	Myprinter p1 = new Myprinter;  构造函数私有,不可访问
//	
//	Myprinter::priptr 从public改成private之后,这行就完蛋了,因为访问不到
//	下面这行也不行
//	Myprinter * p1 = Myprinter::priptr;
//	p1->printext("WULA WULA");
//}

//***************************

class Myprinter
{
public:
	int numOfDo;
	void printext(string str) {
		cout << "执行打印任务!" << endl;
		cout << str << endl;
		numOfDo++;
	}
	int getNum() {
		return numOfDo;
	}
	
	static Myprinter* getInstance() {
		return Myprinter::priptr;
		//但是priptr是static  非静态成员函数无法访问它
	}
private:

	static Myprinter* priptr;
	Myprinter() {
		cout << "构造函数私有" << endl;
		numOfDo = 0;
	}

};

Myprinter* Myprinter::priptr = new Myprinter;

void test() {
	
	Myprinter* p1 = Myprinter::getInstance();
	p1->printext("WULA WULA");

	Myprinter* p2 = Myprinter::getInstance();
	p2->printext("HA HA HA HA");
	cout << "执行任务共  " << p2->getNum() << endl;
}

int main()
{
	test();
   
}

程序运行结果

构造函数私有
执行打印任务!
WULA WULA
执行打印任务!
HA HA HA HA
执行任务共  2

修改:上述代码缺陷:加入使用拷贝构造函数创建一个新的打印机,就违背了单例模式的初衷。

Myprinter * p3=new Myprinter ( *p1)

故还要使系统的拷贝构造函数也private 

Myprinter (const Myprinter & ) { } 

2.  常函数和常对象

2.1.常函数

类里面的函数自带this指针,this指针相当于   类名 * const ptr ,是一个指向不能更改的指针(指针常量)。 而这个函数如果被const修饰,意思就是指向的对象(类本身)的属性不可以再修改。

注意,加了mutable修饰的属性例外。

2.2 常对象

常对象只能调用常函数。

class Pet
{
public:
	Pet();
	~Pet();
	int a;
	mutable int b;
	void fun()
	{
		cout << "a = "<<a << endl;
		cout << "b = "<<b << endl;
		a = 30;//不报错,普通函数咋改成员属性都行
		b = 300;

	}
	void fun2()const
	{
		cout << "长函数" << endl;
		cout << "a = " << a << endl;
		cout << "b = " << b << endl;

		//a = 23; 表达式必须是可修改的左值
		b = 200;//不报错。因为int b 前面有mutable
	}
private:

};

Pet::Pet()
{
	a = 23;
	b = 45;
}

Pet::~Pet()
{
}

void test() {
	Pet p1;
	
	p1.fun();//23  45
	p1.fun2(); //30  300
	cout << "***********" << endl;
	cout << "p1调用了普通函数,修改了a b的值之后,又调用常函数修改b的值" << endl;
	cout << p1.a << "   "<<p1.b << endl;//30  200
	cout << "***********" << endl;
	const Pet p2;
	p2.fun2();//23  45
	p2.fun2();//23  200
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值