目录
1请设计一个类,不能被拷贝
2请设计一个类,只能在堆上创建对象
3请设计一个类,只能在栈上创建对象
4请设计一个类,不能被继承
5请设计一个类,只能创建一个对象(单例模式)
1.请设计一个类,不能被拷贝
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
在C 98中,将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。
代码语言:javascript复制//C 98
class CopyBan
{
//...
private:
CopyBan(const CopyBan&);
CopyBan& operator=(const CopyBan&);
//...
};
①设置成私有之后,如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了。
②只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。
在C 11中,C 11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。
代码语言:javascript复制//C 11
class CopyBan
{
//...
CopyBan(const CopyBan&) = delete;
CopyBan& operator=(const CopyBan&) = delete;
//...
};
2.请设计一个类,只能在堆上创建对象
实现方法:
只能在堆上创建对象,意味着我们需要禁止产生栈对象,只能在堆上创建对象。由于在栈上的对象会自动析构,因此把析构函数私有化。
同时将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。
最后提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
代码语言:javascript复制//只能在堆上创建对象的类
class HeapOnly
{
public:
//通过静态成员函数,在堆上完成对象的创建
static HeapOnly* CreateObj()
{
return new HeapOnly;
}
void Destory()
{
this->~HeapOnly();
}
private:
~HeapOnly()
{}
//将构造函数和拷贝构造私有
HeapOnly()
{}
HeapOnly(const HeapOnly&) = delete;
};
int main()
{
//创建失败,因为构造函数HeapOnly()私有了
// //这个对象除了会调用构造函数,还会调用析构函数
//HeapOnly hp1;
//HeapOnly* php2 = new HeapOnly;
//static HeapOnly hp3;
//通过调用静态成员函数,创建堆上的对象
HeapOnly* php4 = HeapOnly::CreateObj();
//拷贝失败,因为拷贝构造函数HeapOnly(const HeapOnly&)被删除了
//HeapOnly hp5(*php4);
//delete php4;
php4->Destory();
return 0;
}
3.请设计一个类,只能在栈上创建对象
产生堆对象的唯一方法是new出来,我们只需把new的重载和delete重载给禁止掉了