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
}