线上购物网站建设成本,怎么创造游戏软件,东莞市网站设计,推广软文案例文章目录 1.设计一个类#xff0c;不能被拷贝2.设计一个类#xff0c;只能在堆上创建对象3.设计一个类#xff0c;只能在栈上创建对象4.设计一个类#xff0c;不能被继承5.设计一个类#xff0c;只能创建一个对象5.1 单例模式5.2 饿汉模式5.3 懒汉模式5.4 两种模式的析构函… 文章目录 1.设计一个类不能被拷贝2.设计一个类只能在堆上创建对象3.设计一个类只能在栈上创建对象4.设计一个类不能被继承5.设计一个类只能创建一个对象5.1 单例模式5.2 饿汉模式5.3 懒汉模式5.4 两种模式的析构函数5.5 两种模式的优缺点 1.设计一个类不能被拷贝
拷贝只会发生在两个场景中拷贝构造函数以及赋值运算符重载。因此想要让一个类禁止拷贝只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
C98的方法将拷贝构造函数与赋值运算符重载只声明不定义并且将其访问权限设置为私有即可。 原因 1.设置成私有如果只声明没有设置成private用户自己如果在类外定义了就可以不能禁止拷贝了。 2. 只声明不定义不定义是因为该函数根本不会调用定义了其实也没有什么意义不写反而还简单而且如果定义了就不会防止成员函数内部拷贝了。
C11的方法C11扩展delete的用法delete除了释放new申请的资源外如果在默认成员函数后跟上delete表示让编译器删除掉该默认成员函数。
2.设计一个类只能在堆上创建对象
我们正常创建一个对象有三种 在栈上堆上和静态区现在我们只能在堆上创建。
实现方式 1.将类的构造函数私有拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。 2.提供一个成员函数在该成员函数中完成堆对象的创建。 但是现在存在一个问题我们要创建一个对象需要调用这个成员函数而调用这个函数又需要一个对象。这就出现了矛盾了。
解决方法改成静态的成员函数。 原因其它函数需要用对象去调用而构造函数不需要所以可以new 构造函数。加上static后函数就没有this指针外面可以直接调用CreateObj了。 但是现在还存在一个问题拷贝构造的时候那个拷贝对象是在栈上。 解决方法就是不让它进行拷贝构造
3.设计一个类只能在栈上创建对象
方法和上面的差不多但需要改变一些 因为这里是传值所以是需要拷贝构造的那么就不能把拷贝构造删除或者设置成私有。 但是现在还存在的问题是能用new调用拷贝构造申请对象。 那么我们就 禁掉operator new可以把new 调用拷贝构造申请对象给禁掉。因为我们这里重载了operator new那么它就不会去调用全局而去调用我们自己的。
4.设计一个类不能被继承
C98方式构造函数私有化派生类中调不到基类的构造函数。则无法继承。 C11方式final关键字final修饰类表示该类不能被继承。
5.设计一个类只能创建一个对象
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化设计模式是软件工程的基石脉络如同大厦的结构一样。
5.1 单例模式
单例模式一个类只能创建一个对象该模式可以保证系统中该类只有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享。 比如在某个服务器程序中该服务器的配置信息存放在一个文件中这些配置数据由一个单例对象统一读取然后服务进程中的其它对象再通过这个单例对象获取这些配置信息这种方式简化了在复杂环境下的配置管理。
单例模式有两种实现模式饿汉模式和懒汉模式。
5.2 饿汉模式
饿汉模式就是说不管你将来用不用程序启动时就创建一个唯一的实例对象。 这里我们在类里面定义了一个静态的对象这样行不行。
为什么这样是可以的呢 原因是这个静态的对象其实是不在这个类里的。它是所有对象的它生命周期和全局的一样只是会受到类域的限制。
那么为什么不设置全局的呢 原因是全局不能访问私有的。
我们这里仅仅是声明还没有定义我们还需要在程序入口之前就完成单例对象的初始化。 这样我们再把定义好的对象返回。
我们这里也可以定义指针 不过我们还要把拷贝构造给删除 那么我们想得到这个对象只能调用这个函数
5.3 懒汉模式
如果单例对象构造十分耗时或者占用很多资源比如加载插件啊 初始化网络连接啊读取文件啊等等而有可能该对象程序运行时不会用到那么也要在程序一开始就进行初始化就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式延迟加载更好。
懒汉模式一开始不创建对象第一调用GetInstance再创建对象。 懒汉模式只需要在定义的时候定义成空当第一次调用时创建对象其它时候直接把对象返回。
5.4 两种模式的析构函数
单例模式其实不需要写析构函数因为单例模式基本是在整个程序都在使用当进程结束时会一起还给操作系统。
但是在某些特殊的情况下需要析构 析构时需要信息写到文件持久化。 那么我们该怎么执行这个析构函数呢 这里的意思是定义一个静态成员变量程序结束时系统会自动调用它的析构函数从而释放单例对象。这里设置内部类或者外部类都行。
5.5 两种模式的优缺点
我们举个例子来说明一下种模式的优缺点 现在有两个单例对象一个数据库对象一个缓存对象。
如果要求先初始化数据库对象再初始化缓存对象我们该选择那个模式 饿汉模式控制不住因为它是程序开始前就初始化所以初始化顺序不确定就可能会报错。
懒汉模式可以控制因为当第一次为空的时候才会创建。
饿汉模式缺点可能会导致进程启动慢且如果有多个单例类对象实例启动顺序不确定。优点简单。
懒汉模式缺点复杂。优点第一次使用实例对象时创建对象。进程启动无负载。多个单例实例启动顺序自由控制。