用html5制作个人网站建站之星模板的使用
web/
2025/9/26 23:50:24/
文章来源:
用html5制作个人网站,建站之星模板的使用,京东联盟的网站怎么做,百度云资源文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类#xff08;单例模式#xff09; 1. 前言 在实际场景中#xff0c;我们在编写类的过程中总会遇到一些特殊情况#xff0c;比如设计一个类不… 文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类单例模式 1. 前言 在实际场景中我们在编写类的过程中总会遇到一些特殊情况比如设计一个类不能被拷贝/不能被继承/只能在堆上创建对象/只能在栈上创建对象/只能创建一个对象基于这些场景我们来谈谈这些特殊类该如何实现。 2. 不能被拷贝的类 拷贝只会放生在两个场景中拷贝构造函数以及赋值运算符重载因此想要让一个类禁止拷贝只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98的实现方法 将拷贝构造函数与赋值运算符重载只声明不定义并且将其访问权限设置为私有即可。 class CopyBan
{// ...
private:CopyBan(const CopyBan);CopyBan operator(const CopyBan);//...
};原因 设置成私有如果只声明没有设置成private用户自己如果在类外定义了就可以不能禁止拷贝了。 只声明不定义不定义是因为该函数根本不会调用定义了其实也没有什么意义不写反而还简单而且如果定义了就不会防止成员函数内部拷贝了。 C11的实现方法 C11扩展delete的用法delete除了释放new申请的资源外如果在默认成员函数后跟上delete表示让编译器删除掉该默认成员函数。 class CopyBan
{// ...CopyBan(const CopyBan) delete;CopyBan operator(const CopyBan) delete;//...
};3. 不能被继承的类 C98的实现方法 构造函数私有化派生类中调不到基类的构造函数则无法继承。 class NonInherit
{
public:static NonInherit GetInstance(){return NonInherit();}
private:NonInherit(){}
};C11的实现方法 final关键字final修饰类表示该类不能被继承。 class NonInherit final
{// ....
};4. 只能在堆上创建对象的类 顾名思义就是只能通过new来创建对象一般的实现思路有以下两种注意细节处理。 析构函数私有化 将析构函数私有化后由于对象析构时并不能调用到析构函数所以在栈上直接创建对象会报错我们只能在堆上new一个对象。但是在销毁对象时我们不能使用delete直接销毁对象因为delete也会调用到析构函数这里可以特殊处理在共有域定义一个函数此函数显示调用析构。 class HeapOnly
{
public:void destory(){delete this;}
private:~HeapOnly(){cout 调用析构成功! endl;}
};
int main()
{//HeapOnly ho1; // error 析构函数不可访问无法创建对象HeapOnly* ho2 new HeapOnly;//delete ho2; // error 析构函数不可访问无法销毁对象 h2-destory();return 0;
}构造函数私有化 将构造函数私有化后由于对象创建时无法调用到构造函数所以不管在堆上还是栈上都无法创建对象。在这里我们可以在公有域定义一个函数去在堆上创建一个该类的对象并返回指向这块空间的指针我们巧妙地将其设置成static函数这样我们就可以通过类名来调用该函数而该函数是唯一创建该类对象的方法。 class HeapOnly
{
public:static HeapOnly* CreateObject(int x 0){return new HeapOnly(x);}
private:HeapOnly(int x 0) :_x(x){}int _x;
};int main()
{//HeapOnly ho1; // error 构造函数不可访问无法创建对象//HeapOnly* ho2 new HeapOnly; // error 构造函数不可访问无法创建对象HeapOnly* ho3 HeapOnly::CreateObject(10);return 0;
}细节处理 做到以上的实现后我们还需拷贝构造声明成私有防止别人调用拷贝在栈上生成对象。 // C98
private:HeapOnly(const HeapOnly);
// C11
HeapOnly(const HeapOnly) delete;5. 只能在栈上创建对象的类 有了前面的思路我们可以利用构造函数私有化来解决此问题。 设计方法将构造函数私有化然后设计静态函数创建返回对象即可。
注意这里需要将operator new和operator delete禁用因为new可以调用拷贝构造创建对象如果我们在类中没有重载operator newnew就会调用全局的operator new所以要想禁用new则需要在类中将operator new禁用。
class StackOnly
{
public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new调用拷贝构造创建对象给禁掉void* operator new(size_t size) delete;void operator delete(void* p) delete;
private:StackOnly():_a(0){}
private:int _a;
};int main()
{StackOnly so1 StackOnly::CreateObj();//StackOnly* so2 new StackOnly(so1); // error 无法引用operator newreturn 0;
}6. 只能创建一个对象的类单例模式
在学习单例模式前我们先来了解一下设计模式 设计模式Design Pattern是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期七国之间经常打仗就发现打仗也是有套路的后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。 使用设计模式的目的为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化设计模式是软件工程的基石脉络如同大厦的结构一样。 单例模式就是设计模式的一种 单例模式 一个类只能创建一个对象即单例模式该模式可以保证系统中该类只有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享。比如在某个服务器程序中该服务器的配置信息存放在一个文件中这些配置数据由一个单例对象统一读取然后服务进程中的其他对象再通过这个单例对象获取这些配置信息这种方式简化了在复杂环境下的配置管理。 单例模式有两种实现模式 饿汉模式 就是说不管你将来用不用程序启动时就创建一个唯一的实例对象。 具体代码实现 class Singleton
{
public:static Singleton* GetInstance(){return _ins;}
private://限制类外随意创建对象Singleton(const Singleton s) delete;Singleton operator(const Singleton s) delete;Singleton() {}static Singleton* _ins;
};
Singleton* Singleton::_ins new Singleton; // 在程序入口之前就完成单例对象的初始化优点简单。缺点可能会导致进程启动慢且如果有多个单例类对象实例启动顺序不确定。 如果这个单例对象在多线程高并发环境下频繁使用性能要求较高那么显然使用饿汉模式来避免资源竞争提高响应速度更好 懒汉模式 如果单例对象构造十分耗时或者占用很多资源比如加载插件 初始化网络连接读取文件等等而有可能该对象程序运行时不会用到那么也要在程序一开始就进行初始化就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式延迟加载更好。 具体代码实现 //懒汉模式
class Singleton
{
public:static Singleton* GetInstance(){if (m_pInstance nullptr){m_mtx.lock();if (m_pInstance nullptr){m_pInstance new Singleton();}m_mtx.unlock();}return m_pInstance;}// 实现一个内嵌垃圾回收类class CGarbo{public:~CGarbo(){if (Singleton::m_pInstance)delete Singleton::m_pInstance;}};// 定义一个静态成员变量程序结束时系统会自动调用它的析构函数从而释放单例对象static CGarbo Garbo;private://限制类外随意创建对象Singleton(const Singleton s) delete;Singleton operator(const Singleton s) delete;Singleton() {}
private:static Singleton* m_pInstance; // 单例对象指针static mutex m_mtx; // 互斥锁
};
Singleton* Singleton::m_pInstance nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;与饿函数模式不同的是懒汉模式在多线程情况下有线程安全问题所以在第一次拿唯一的对象前需要加锁并且对象在程序启动时被置空了只有调用了GetInstance()才会真正的分配空间。 拓展C常用的11种设计模式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82443.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!