特殊类设计
目录
一.特殊类设计
1.设计一个类,不能拷贝。
2.设计一个类,只能在堆上创建对象。
3.设计一个类,只能在栈上创建对象。
4.实现一个类,该类不能被继承。
二.*设计模式
单例模式
1.饿汉模式
2.懒汉模式
一.特殊类设计
1.设计一个类,不能拷贝。
将拷贝构造和赋值重载用delete禁掉(C++11);或将构造设为私有(C++98)
2.设计一个类,只能在堆上创建对象。
方法一:堆上的对象特点:手动释放资源(析构),而其他对象都是自动生命周期结束后,自动调用析构函数,所以仅需将析构函数设为私有,然后在public中写一个能够释放资源的成员函数即可。
方法二:将构造函数、拷贝构造、赋值重载设为私有,写一个public的静态成员函数(return new tmp;),去调构造。
3.设计一个类,只能在栈上创建对象。
方法:将构造函数封死,用静态成员函数+拷贝构造创建对象。但是,若 new 创建对象时,不是用默认构造初始化,而是用拷贝构造初始化,则也能创建堆上的对象。所以,我们需要对operator new 进行重载,将operator new 禁用掉。
4.实现一个类,该类不能被继承。
方法:①用fianl修饰类(C++11); ②构造函数私有化(C++98)
为什么构造函数私有化能让一个类不能被继承?
--- 基类中的私有成员对于派生类而言“不可见”,而继承时,派生类必须要先调用基类的构造函数,由于派生类无法访问基类中“不可见”的成员,所以基类构造失败。
二.设计模式
啥是设计模式,或者说设计模式有什么用?
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。就像人类历史发展会产生兵法,最开始人类部落之间打仗都是人数对拼,后来到了春秋战国,七国之间经常打仗,就发现打仗也是有套路的,后来孙子著兵法,总结打仗的套路。
设计模式的意义:为了代码的可重用性更高、代码更容易被他人理解、保证代码的可靠性。设计模式使用代码编写真正工程化。设计模式是软件工程的基石脉络,如同大厦的结构一样。
*单例模式
一个类只能创建一个对象,即单例模式。单例模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其它对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。
单例模式有两种实现方式,即懒汉模式和饿汉模式~ ~
单例模式的核心:构造函数私有化 + 私有静态单例对象 + 获取单例对象公有接口。
1.饿汉模式
特点:在进入main()函数之前,就创建单例对象(仿佛抢不着饭吃,饿死鬼似的)。
在main()函数的外面对静态单例对象实例化,程序启动时,就会在进入main()函数之前就为单例对象开辟资源。
由于单例对象是在类的内部生命的,所以单例对象实例化时,可以访问私有的构造函数。
为防止单例类的拷贝、定义新对象等操作,我们需要将拷贝构造、赋值重载给禁掉。
假设我们想让一份unordered_map类型的资源在整个进程的生命周期中只有一份,就可以将其封装为单例类,具体代码如下:
饿汉模式的缺点:
①如果单例对象初始化内容很多,会影响程序的启动速度;
②如果两个单例类,要求A先创建,B再创建,B的初始化依赖A,无法保证A和B的初始化顺序;
2.懒汉模式
特点:会在进入main()函数之后,当我们调用GetInstance()接口时,才对单例对象实例化。
实现机制:将单例对象设为指针类型,当我们调用GetInstance()时,才对指针开辟空间。
代码如下(仍为保证unordered_map中的资源全局只有一份):