目录
一、设计一个类,不能被拷贝
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
{
// ....
};