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
{
    // ....
};

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值