1. 设计一个类只能在堆上创建对象。
- 实现方式:
(1)将类的构造函数,拷贝构造函数设置为私有,防止别人调用,防止别人调用拷贝在栈上生成对象。
(2)提供静态成员函数,在函数中完成堆对象的创建。
class Base
{
private:
Base()
{}
Base(const Base&)
{
}
Base(const Base& a) = delete;//C++11的做法;
public:
static Base* fun()
{
return new Base;//在堆上创建
}
};
2. 设计一个类 在栈上创建一个对象:
方法一:
- 将构造函数私有,静态成员函数创建对象返回:
class Base
{
private:
Base()
{}
public:
static Base& fun(const Base&)
{
return Base();
}
};
方法二:
- 重新定义new和delete的方法,进而屏蔽掉系统内部的new。
class Base
{
public:
Base()
{}
private:
void* operator new(size_t s)
{}
void operator delete(void* p)
{}
};
3. 设计一个不能被拷贝的类:
- 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可:
//C++98:
class Base
{
private:
Base(const Base&);
Base& operator=(const Base&);
//...
};
//C++11中的做法
class Base
{
//...
Base(const Base&) = delete;
Base& operator=(const Base&) = delete;
//...
};
在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。
4. 设计的类不能被继承。
方法一:构造函数私有化,派生类无法让基类使用基类构造函数创建对象:
方法二:C++11,final关键字。
// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class Inherit
{
public:
static Inherit GetInstance()
{
return Inherit();
}
private:
Inherit()
{}
};
//C++11做法
class Base final
{
//...
};