当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/2866.html

相关文章:

  • 【MySQL】表的约束
  • ComfyUI的部署,Ubuntu22.04系统下——点动科技
  • 基于Conda的Python版本管理与Python包管理
  • 探索顶级PDF水印API:PDFBlocks(2024年更新)
  • Flutter Web 正式官宣弃用 HTML renderer , Canvas 路线成为唯一
  • 统一服务入口-Gateway(一)
  • 使用 Python 爬虫进行网站流量分析:Referer 头的利用
  • LeetCode239.滑动窗口最大值
  • CSS的:dir()伪类:根据文本方向定制样式的灵活工具
  • 【文献阅读】Lorentzian Linear Graph Convolutional Networks For Node Classification
  • EmguCV学习笔记 C# 5.1 基本变换
  • SQLite 删除表
  • Leetcode-高频面试题-143.重排链表
  • 树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结
  • SOMEIP_ETS_052: echoUTF8DYNAMIC_wrong_BOM
  • ansible初使用与http原理
  • 【C++】OJ习题(初阶)
  • C语言--静态链表
  • 测试环境频繁报:RedisCommandInterruptedException: Command interrupted
  • 父子模块的maven以及Ajax实现人工管理系统