C++特殊类设计
目录
一、设计一个类,不能被拷贝
1.C++98
2.C++11
二、设计一个类,只能在堆上创建对象
1.析构函数私有化
2.构造函数私有化
三、请设计一个类,只能在栈上创建对象
四、设计一个类不能被继承
1.C++98方式
2.C++11方式
一、设计一个类,不能被拷贝
1.C++98
将拷贝构造函数与赋值运算符重载设为私有,且只声明不定义
class CopyBan
{// ...private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);//...
};
①设置成私有:为了防止别人在外面瞎搞,要是public,外界可以访问类成员
②只声明不定义:不声明编译器会自动生成,声明编译器就不会生成,不定义是防止成员函数内部拷贝了。
2.C++11
C++11扩展delete的用法,禁止生成默认的成员函数
class CopyBan
{// ...CopyBan(const CopyBan&)=delete;CopyBan& operator=(const CopyBan&)=delete;//...
};
二、设计一个类,只能在堆上创建对象
1.析构函数私有化
①栈区和静态区的资源在生命周期结束的时候会调用析构函数
②而对于堆区的,不会自动调用析构函数,需要手动去释放,
③但是由于析构函数私有化了,所以我们可以通过一个接口去析构

2.构造函数私有化
①构造函数私有化对栈区和静态区和堆区的对象创建均有影响

②设置公有创建对象的函数,设置为静态,因为静态函数可以通过类名去直接访问公有成员

③将拷贝构造函数私有,赋值运算符重载可设置可不设置,为了防止下面的情况

三、请设计一个类,只能在栈上创建对象
①构造函数私有对堆区,栈区,静态区都有影响
堆区:有new对象,栈区:有匿名对象,静态区:static修饰的

②写一个静态公有的函数,返回匿名对象

③虽然static StackOnly st2创建失败,但是拷贝构造创建成功---->把拷贝构造禁止生成?

④出现问题,因为传值返回,会调用拷贝构造

⑤传值返回,返回临时对象,编译器识别成将亡值,调用移动构造。但是如果将拷贝对象强制识别为右值,依旧可以创建对象

四、设计一个类不能被继承
1.C++98方式
子类必须调父类的四个成员函数之一去初始化父类的部分,将构造函数私有化
class NonInherit
{
public:static NonInherit GetInstance(){return NonInherit();}
private:NonInherit(){}
};
2.C++11方式
final修饰类,表示该类不能被继承。
class A final
{// ....
};
