【C++语言】特殊类设计

一、请设计一个类,不能被拷贝

拷贝只会发生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

C++98

将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。

原因:

设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就介意不能禁止拷贝了

只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单了,而且如果定义了就不会防止成员函数内部拷贝了

C++11

C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器除掉该默认成员函数。

二、请设计一个类,只能在堆上创建对象

实现方式:

将类的构造函数私有,拷贝构造函数声明成私有。防止别人调用拷贝在栈上生成对象。

提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。

class HeapOnly
{
public:
    static HeapOnly* CreateObject()
    {
        return new HeapOnly;
    }
private:
    HeapOnly() {}

    // C++98
    HeapOnly(const HeapOnly&);
    // C++11    
    heapOnly(const HeapOnly&) = delete;
};

三、请设计一个类,只能在栈上创建对象

同上将构造函数私有化,然后设计静态方法创建对象返回即可。

class HeapOnly
{
public:
    static HeapOnly CreateObject()
    {
        return HeapOnly();
    }    

    // 将new和delete都删掉
    void* operator new(size_t size) = delete;
    void operaot delete(void* p) = delete;

private:
    HeapOnly() : m_a(0)
    {}
    
    int m_a;
};

四、请设计一个类,不能被继承

C++98

将构造函数私有化,派生类中钓不到基类的构造函数,则无法继承

class NoInherit
{
public:
    static NoInherit GetInstance()
    {
        return NoInherit();
    }
private:
    NoInherit()
    {}
};

C++11

finial 关键字,finial修饰类,表示该类不能被继承

class A finial
{
};

五、请设计一个类,只能修饰一个对象(单例模式)

单例模式:

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

单例模式有两种实现模式:

饿汉模式

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

class Singleton
{
public:
    static Singleton* GetInatance()
    {
        return &m_instance;
    }
private:
    Singleton() {}
    
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&)

    static Singleton m_instance;
};

Singleton Singleton::m_instance;
如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避
免资源竞争,提高响应速度更好

懒汉模式

class Singleton
{
public:
	static Singleton* GetInstance() {
		// 注意这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全
		if (nullptr == m_pInstance) {
			m_mtx.lock();
			if (nullptr == m_pInstance) {
				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() {};
	// 防拷贝
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);
	static Singleton* m_pInstance; // 单例对象指针
	static mutex m_mtx;   //互斥锁
};
Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;

你可能感兴趣的:(c++,开发语言)