加强网站和公众号建设,如何获取所有网站,济南网站建设咨询小七,哪里有做家教网站的目录
一、设计一个禁止拷贝的类
二、设计一个只能在堆区上创建对象的类
三、设计一个只能在栈区和静态区上创建对象的类
四、设计一个不能继承的类
五、设计一个只能创建一个对象的类#xff08;单例模式#xff09; 一、设计一个禁止拷贝的类
拷贝只会发生在两个场景中…目录
一、设计一个禁止拷贝的类
二、设计一个只能在堆区上创建对象的类
三、设计一个只能在栈区和静态区上创建对象的类
四、设计一个不能继承的类
五、设计一个只能创建一个对象的类单例模式 一、设计一个禁止拷贝的类
拷贝只会发生在两个场景中分别是拷贝构造和赋值因此想要让一个类禁止拷贝只需要让该类对象不能调用拷贝构造函数以及赋值运算符重载即可。 C98/03 class CopyBan
{
public:CopyBan() { }
private:CopyBan(const CopyBan cb);CopyBan operator(const CopyBan cb);
};
int main()
{CopyBan cb1;// CopyBan cb2(cb1); // error// CopyBan cb3;// cb3 cb1; // errorreturn 0;
} C11 class CopyBan
{
public:CopyBan() { }CopyBan(const CopyBan cb) delete;CopyBan operator(const CopyBan cb) delete;
};
int main()
{CopyBan cb1;// CopyBan cb2(cb1); // error// CopyBan cb3;// cb3 cb1; // errorreturn 0;
} 二、设计一个只能在堆区上创建对象的类 将类的构造函数设置为私有同时禁止拷贝构造函数的生成防止通过拷贝构造创建对象最后提供一个创建堆对象的静态成员函数。 #include iostream
using namespace std;class HeapOnly
{
public:static HeapOnly* Create(){return new HeapOnly;}
private:HeapOnly(){cout HeapOnly() endl;}HeapOnly(const HeapOnly ho) delete;
};int main()
{// HeapOnly ho; // error// static HeapOnly sho; // errorHeapOnly* pho HeapOnly::Create(); // HeapOnly()// HeapOnly copy(*pho); // errordelete pho;return 0;
} 将类的析构函数设置为私有然后提供一个完成 delete 操作的静态成员函数。 #include iostream
using namespace std;class HeapOnly
{
public:void Destroy(){delete this;}
private:~HeapOnly(){cout ~HeapOnly() endl;}
};int main()
{// HeapOnly ho; // error// static HeapOnly sho; // errorHeapOnly* pho new HeapOnly;// HeapOnly copy(*pho); // errorpho-Destroy(); // ~HeapOnly()return 0;
} 三、设计一个只能在栈区和静态区上创建对象的类 将类的构造函数设置为私有然后提供一个创建对象的静态成员函数。 #include iostream
using namespace std;
class StackStaticOnly
{
public:static StackStaticOnly CreateObj(){return StackStaticOnly();}
private:StackStaticOnly(){cout StackStaticOnly() endl;}
};
int main()
{StackStaticOnly sso StackStaticOnly::CreateObj(); // StackStaticOnly()static StackStaticOnly ssso StackStaticOnly::CreateObj(); // StackStaticOnly()// StackStaticOnly* psso1 new StackStaticOnly; // error// 注意该方法无法防止以下的情况发生// StackStaticOnly* psso2 new StackStaticOnly(sso); // ok// 如果禁止拷贝构造函数的生成会导致 CreateObj 函数发生错误return 0;
} 直接禁止 operator new 和 operator delete 的生成。 class StackStaticOnly
{void* operator new(size_t size) delete;void operator delete(void* p) delete;
};
int main()
{StackStaticOnly sso;static StackStaticOnly ssso;// StackStaticOnly* psso1 new StackStaticOnly; // error// StackStaticOnly* psso2 new StackStaticOnly(sso); // errorreturn 0;
} 四、设计一个不能继承的类 C98/03 将基类的构造函数设置私有派生类就无法调用基类的构造函数因此无法继承。 class NonInherit
{
public:static NonInherit CreateObj(){return NonInherit();}
private:NonInherit() { }
}; C11 使用 final 关键字修饰类表示该类不能被继承。 class NonInherit final
{ }; 五、设计一个只能创建一个对象的类单例模式
设计模式Design Pattern是一种针对软件设计中经常出现的问题和解决方案的标准化描述。它们可以被视为是经验丰富的软件开发人员在解决类似问题时总结出来的设计思路、原则和指导。设计模式帮助我们以一种可重用的方式来解决特定的设计问题从而使代码更具灵活性、可维护性和可扩展性。
单例模式一个类只能创建一个对象。该模式可以保证系统中该类只有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享。比如在某个服务器程序中该服务器的配置信息存放在一个文件中这些配置数据由一个单例对象统一读取然后服务进程中的其他对象再通过这个单例对象获取这些配置信息这种方式简化了在复杂环境下的配置管理。
单例模式有以下两种实现模式 饿汉模式 在程序入口之前就完成了单例对象的初始化。 #include iostream
using namespace std;
class Singleton
{
public:// 提供一个获取单例对象的静态成员函数static Singleton GetInstance(){return _ss;}
private:// 将类的构造函数设置为私有Singleton() {cout Singleton() endl;}
// 禁止拷贝构造函数的生成Singleton(const Singleton s) delete;
static Singleton _ss; // 注意静态成员变量属于类不属于某个具体的对象
};
Singleton Singleton::_ss; // Singleton()
int main()
{cout Singleton::GetInstance() endl;cout Singleton::GetInstance() endl;// 输出的两个地址是相同的
// Singleton copy(Singleton::GetInstance()); // errorreturn 0;
} 懒汉模式 如果单例对象构造十分耗时或者占用很多资源比如加载插件、初始化网络连接、读取文件等等而该对象在程序运行时又有可能不会用到那么使用饿汉模式在程序入口之前就完成单例对象的初始化会导致程序启动时变得非常缓慢所以在这种情况下使用懒汉模式延迟加载更好。 #include iostream
using namespace std;
class Singleton
{
public:static Singleton GetInstance(){if (_pss nullptr){_pss new Singleton;}return *_pss;}
// 一般情况下单例对象是不需要释放的// 特殊场景// 1、中途需要显示释放// 2、程序结束时需要做一些特殊动作比如持久化static void DelInstance(){if (_pss){delete _pss;_pss nullptr;}}
private:Singleton(){cout Singleton() endl;}
~Singleton(){cout ~Singleton() endl;}
Singleton(const Singleton s) delete;
static Singleton* _pss;
};
Singleton* Singleton::_pss nullptr;
int main()
{cout Singleton::GetInstance() endl;cout Singleton::GetInstance() endl;// Singleton()// 输出的两个地址是相同的
// Singleton copy(Singleton::GetInstance()); // error
Singleton::DelInstance();// ~Singleton()return 0;
}