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

C++入门——21特殊的类

1.不能被拷贝的类

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

1.1将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有。

  1. 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了
  2. 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。
class CopyBan
{// ...private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);//...
};

1.2在拷贝构造函数以及赋值运算符重载函数后跟上=delete

表示让编译器删除掉该默认成员函数。

class CopyBan
{// ...CopyBan(const CopyBan&)=delete;CopyBan& operator=(const CopyBan&)=delete;//...
};

2.只能在堆上创建对象的类

实现方式:
        1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。
        2. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

2.1将构造、拷贝构造函数只声明不定义,并且将其访问权限设置为私有。

class HeapOnly
{
public:static HeapOnly* CreateObject(){return new HeapOnly;}
private:HeapOnly() {}// 1.只声明,不实现。因为实现可能会很麻烦,而本身不需要// 2.声明成私有HeapOnly(const HeapOnly&);
};

2.在拷贝构造函数后跟上=delete

class CopyBan
{// ...CopyBan(const CopyBan&)=delete;CopyBan& operator=(const CopyBan&)=delete;//...
};class HeapOnly
{
public:static HeapOnly* CreateObject(){return new HeapOnly;}
private:HeapOnly() {}// 1.只声明,不实现。因为实现可能会很麻烦,而本身不需要// 2.声明成私有HeapOnly(const HeapOnly&) = delete;
};

3.只在栈上创建对象的类

同上将构造函数私有化,然后设计静态方法创建对象返回即可。

class StackOnly
{
public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉// StackOnly obj = StackOnly::CreateObj();// StackOnly* ptr3 = new StackOnly(obj);void* operator new(size_t size) = delete;//void operator delete(void* p) = delete;
private:StackOnly():_a(0){}private:int _a;
};

4.不能被继承的类

构造函数私有化

class NonInherit
{
public:static NonInherit GetInstance(){return NonInherit();}
private:NonInherit(){}
};

final关键字,final修饰类,表示该类不能被继承

class A final
{// ....
};

5.只能创建一个对象的类(单例模式)

 5.1饿汉模式

不管你将来用不用,程序启动时就创建一个唯一的实例对象。可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。

InfoMgr -- 单例
class InfoMgr
{
public:static InfoMgr* GetInstance(){return _spInst;}void SetAddress(const string& s){_address = s;}string& GetAddress(){return _address;}private:InfoMgr(){}InfoMgr(const InfoMgr&) = delete;string _address;int _secretKey;static InfoMgr* _spInst; // 声明
};InfoMgr* InfoMgr::_spInst = new InfoMgr; // 定义int main()
{//InfoMgr info1;//static InfoMgr info2;//InfoMgr info3;// 全局只有一个InfoMgr对象InfoMgr::GetInstance()->SetAddress("xxxxxx");cout << InfoMgr::GetInstance()->GetAddress() << endl;return 0;
}

5.2懒汉模式

第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制。

class InfoMgr
{
public:static InfoMgr* GetInstance(){// 还需要加锁  -- 双检查加锁if (_spInst == nullptr){_spInst = new InfoMgr;}return _spInst;}void SetAddress(const string& s){_address = s;}string& GetAddress(){return _address;}// 实现一个内嵌垃圾回收类    class CGarbo {public:~CGarbo(){if (_spInst)delete _spInst;}};// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象static CGarbo Garbo;private:InfoMgr(){}~InfoMgr(){// 假设析构时需要信息写到文件持久化}InfoMgr(const InfoMgr&) = delete;string _address;int _secretKey;static InfoMgr* _spInst; // 声明
};InfoMgr* InfoMgr::_spInst = nullptr; // 定义
InfoMgr::CGarbo Garbo;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PostgreSQL下载、安装(Windows 10/11 64位)详细教程【超详细,保姆级教程!!!】
  • python——常见创建型设计模式
  • 仿RabbitMq实现简易消息队列正式篇(路由匹配篇)
  • BFS解决单源最短路问题
  • MySql 高阶二(SQL 性能分析)
  • QT翻金币小游戏(含音频图片文件资源)
  • c#使用Microsoft.Office.Interop.Word提示无法嵌入或操作型“ApplicationClass”。请改用试用的接口。
  • day45-dynamic programming-part12-8.16
  • Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码
  • 【排序算法】八大排序(上)(c语言实现)(附源码)
  • [Linux] 关于执行文件路径的变量:$PATH
  • SpringBoot自定义类加载器
  • linux查看网卡速度和pcie速度
  • 【Python零基础】while循环和用户输入
  • SPI驱动学习一(协议原理)
  • CODING 缺陷管理功能正式开始公测
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS 提示工具(Tooltip)
  • Docker 笔记(2):Dockerfile
  • ES6 学习笔记(一)let,const和解构赋值
  • Facebook AccountKit 接入的坑点
  • hadoop集群管理系统搭建规划说明
  • Laravel 菜鸟晋级之路
  • leetcode98. Validate Binary Search Tree
  • react-native 安卓真机环境搭建
  • 从零开始在ubuntu上搭建node开发环境
  • 大整数乘法-表格法
  • 基于组件的设计工作流与界面抽象
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊flink的TableFactory
  • 我有几个粽子,和一个故事
  • 国内开源镜像站点
  • ​渐进式Web应用PWA的未来
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #if等命令的学习
  • #include
  • #Linux(Source Insight安装及工程建立)
  • #Linux(帮助手册)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4) PIVOT 和 UPIVOT 的使用
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (笔试题)分解质因式
  • (翻译)terry crowley: 写给程序员
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)c++ std::pair 与 std::make
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET 8.0 中有哪些新的变化?
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 使用配置文件
  • .NetCore部署微服务(二)
  • .py文件应该怎样打开?
  • @NestedConfigurationProperty 注解用法