上海简约网站建设公司,寿光网站建设优化,在百度工作但是是外包,wap网站前景1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类#xff1f;将类的默认构造函数设置为私有#xff0c;再将类的拷贝构造函数设置为delete#xff0c;设置静态函数GetObj#xff0c;内部调用new HeapOnly#xff0c;这样就只能在堆上开辟空间。
class HeapOnly…1、特殊类的设计 如何设计出一个创建出的对象只能在堆上的类将类的默认构造函数设置为私有再将类的拷贝构造函数设置为delete设置静态函数GetObj内部调用new HeapOnly这样就只能在堆上开辟空间。
class HeapOnly
{
public:static HeapOnly* GetObj(){return new HeapOnly;}
private:HeapOnly(){}
public:HeapOnly(const HeapOnly) delete;
}; 下面照猫画虎设计一个只能在栈上创建对象的类。创建对象也是必须通过static成员函数来完成内部调用默认构造函数。
class StackOnly
{
public:static StackOnly GetObj(){return StackOnly();}
private:StackOnly(){}
}; 还有一种思路直接禁止了类的new函数这样不能在堆上开辟空间了但是这种做法是有缺陷的他不通过静态函数来构造对象无法阻止在数据段静态区创建对象比如static StackOnly p;就在静态区创建了一个对象不满足只能在栈创建对象的要求。
class StackOnly
{
public:void* operator new(size_t size) delete;
};
2、单例模式 设计模式是一套被人反复使用、多数人知晓的、经过分类的代码设计经验的总结。使用设计模式的目的是为了提高代码的可重用性让代码更容易被他人理解保证代码的可靠性。设计模式使得代码编写真正地工程化。 之前已经学过的一些设计模式有1迭代器模式基于面向对象三大特性之一的封装设计出来的用一个迭代器封装以后可以在不暴露容器的结构的情况下以一种统一的方式访问修改容器中的数据。2适配器模式体现的是一种复用的思想。 这里介绍一下单例模式。设计一个类在全局中进程中只能实例化出一个对象将这种设计模式称为单例模式。主要应用场景是多线程共享的内存池或者用于处理任务的线程池。 下面是一个简化的单例模式示例为了支持单例的基本属性要将构造函数设置为私有将拷贝构造函数设置为delete要通过静态成员函数GetInstance()来获取对象如果不设置为静态成员函数由于外部无法构造而普通成员函数需要依靠对象来调用因此无法获取对象。
class Singleton
{
public:static Singleton* GetInstance(){if (_pinst nullptr){_pinst new Singleton;}return _pinst;}Singleton(const Singleton s) delete;
private:Singleton(){}static Singleton* _pinst;
};
Singleton* Singleton::_pinst nullptr;上面这段代码依旧有缺陷就是他不能有效应对线程安全问题在上面这个类的单例还没有构造出来的时候这时候_pinst为nullptr假如有两个线程同时进入了GetInstance的if判断语句里面那么会构造出两个对象因此需要用互斥量保护线程安全。下面是一个双检查写法在解决线程安全问题的同时有效保证代码效率只有在_pinst为空时会加锁解锁。还可以使用智能指针来管理_mtx如果在加锁解锁之间出现异常可以避免死锁。
class Singleton
{
public:static Singleton* GetInstance(){if (_pinst nullptr){_mtx.lock();if (_pinst nullptr){_pinst new Singleton;}_mtx.unlock();}return _pinst;}Singleton(const Singleton s) delete;
private:Singleton(){}static Singleton* _pinst;static mutex _mtx;
};Singleton* Singleton::_pinst nullptr;
mutex Singleton::_mtx;单例模式又分为懒汉模式和饿汉模式懒汉模式指的是在获取对象的时候再创建对象上面的写法就是典型的懒汉模式。饿汉模式指的是在一开始main函数之前就创建对象由于对象是在main函数之前创建的创建时只有主线程所以不存在线程安全问题下面是一种饿汉模式的写法。
class Singleton
{
public:static Singleton* GetInstance(){return _inst;}
private:static Singleton _inst;
};
Singleton Singleton::_inst;总结一下饿汉与懒汉的区别1懒汉模式需要考虑线程安全和资源释放的问题实现相对更复杂恶寒模式不存在以上问题实现简单。2懒汉是一种懒加载毛hi在需要时再初始化创建对象不会影响程序的启动。饿汉模式则相反在程序启动阶段就创建初始化实例对象会导致程序启动慢影响体验。3如果有多个单例类假设它们之间有依赖关系要求A单例先创建初始化B单例再创建初始化此处就不能使用饿汉因为无法保证创建对象的顺序静态对象是无法保证创建顺序的这里要用懒汉模式便于程序员手动控制。