C++中实现一些特殊的类|设计模式

news2024/11/18 11:30:48


1.设计一个类 不能被拷贝

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

  1. c++98中 将拷贝构造与赋值运算符重载只声明不定义,不定义是因为该函数根本不会调用,定义了也没有意义,而且如果定义了就不会防止成员函数内部拷贝了。并且将访问权限设为私有。设置为私有:如果只声明没有设置为private,用户自己在类外定义了,就不能禁止拷贝了
  2. c++11中扩展delete的用法,delete除了释放new申请的资源外,如果默认成员函数后面=delete,表示让编译器删除掉该默认成员函数
class copyBan
{
    //...
    private:
        copyBan(const copyBan&);
        copyBan& operator=(const copyBan&);
    //...
};



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

2.设计一个类,在堆上创建

实现方式:

1.将析构函数设置为私有

编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存

2.将构造函数设置为私有,拷贝构造声明称私有,防止别人调用拷贝在栈上生成对象,提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

//1.析构私有
class  A  
{  
public :  
    A(){}  
    void  destory(){ delete   this ;}  
private :  
    ~A(){}  
}; 

//2.构造私有
class A
{
    public:
     static getObj()
       {
            A* p = new A();
            return p;
       }
        
}  
    private:
        A(){}
    public:
        ~A(){}
};

3.设计一个类,在栈上创建

1.将构造函数私有化,设计静态方法创建对象返回

class StackOnly
{
public:
 static StackOnly CreateObj()
 {
 return StackOnly();
 }
    
   
 void* operator new(size_t size) = delete;
 void operator delete(void* p) = delete;
private:
 StackOnly()  
 :_a(0)
 {}
private:
 int _a;
};

4.设计一个类,不能被继承

  1. c++98中将构造函数设置为私有,派生类中调不到基类的构造函数,则无法继承
  2. c++11使用final关键字,final修饰类,表示该类不能被继承
c++98:

class nonInherit
{
    public:
    

    private:
        nonInherit()
        {}
};


c++11
class A final
{
};

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

设计模式:

设计模式是一套被反复使用,代码设计经验的总结。设计设计模式,为了代码可重用性,让代码更容易被理解,保证代码的可靠性。设计模式使代码编写真正工程化

单例模式:

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例模式对象统一读取,然后服务进程中其他对象再通过这个单例对象获取这些配置信息,这种方式简化了再复杂环境下的配置管理。

单例模式有两种实现模式:

饿汉模式:不管将来是否使用,程序启动时就创建一个唯一的实例对象

class singleTon
{
    public:
        static singleTon * getInstance()
        {
            return _ins;
        }

        void add(const string& str)
        {
            _v.push_back(str);
            ++_n;
        }

        void Print()
        {
          for(auto& e:_v)
          {
            cout<<e<<endl;
          }   
        }
    private:
        singleTon()
        {
        }

    private:
        int _n = 0;
        vector<int> _v; //想让vector全局只有一份
        //限制在类外随意创建对象
        static singleTon * _ins;
}

static singleTon:: singleTon * _int = new singleTon; 



int main()
{
    singleTon s1; 


    return 0;
}

懒汉模式:如果单例对象构造十分耗时或者消耗很多资源,比如加载插件,初始化网络连接,读取文件等,而且有可能该对象程序运行时不会用到,那么程序如果一开始就初始化,导致程序启动十分缓慢,这种情况使用懒汉模式(延迟加载)更优

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+vue的校园外卖服务系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

静态路由与默认路由配置

实验原理&#xff1a; 路由分类 &#xff08;1&#xff09;根据目的网络的不同&#xff0c;路由可以划分为&#xff1a; 特定网络路由&#xff1a;目的网络为目的主机所在网络的IP地址&#xff0c;其子网掩码表示的前缀长度为32位&#xff08;对于IPv4地址&#xff09;&…

分布式搜索引擎01

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 1.1.2.ELK…

程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库&#xff0c;这一举动虽然看似微小&#xff0c;但其中的快乐和意义却是无法用言语表达的。 Beego是一个开源的Go语言Web框架&#xff0c;它采用了MVC架构模式&#xff0c;并集成了很多常用的功能和中间件。小插件是指…

Linux chmod命令——修改权限信息

我们可以使用chmod命令&#xff0c;修改文件、文件夹的权限信息。注意&#xff0c;只有文件、文件夹的所属用户或root用户可以修改。 chmod [-R] 权限 文件或文件夹 -R&#xff0c;对文件夹内的全部内容应用同样的操作 例如&#xff1a; chmod urwx,grx,ox hello.txt &…

工业余能资源评价方法 标准学习

声明 本文是学习GB-T 1028-2018 工业余能资源评价方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准界定了工业余能相关术语&#xff0c;规定了工业余能的分类和评价方法。 本标准适用于工业余能资源的评价。 2 术语和定义 下列术…

oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。

场景&#xff1a; 需要获取部分数据集(视图)的业务时间最大值&#xff0c;希望只通过一条语句获取多个的最大值。 则使用select (视图1业务时间最大值),(视图2业务时间最大值),(视图3业务时间最大值) from dual 程序执行过程中&#xff0c;发现语句执行较慢&#xff0c;则进行s…

描述符——配置描述符

描述符定义 描述符实现 /*** brief USB configuration descriptor.*/ typedef struct __attribute__ ((packed)) {uint8_t bLength ; /**< Size of this descriptor in bytes. */uint8_t bDescriptorType ; /**< CONFIGURATION Descriptor Type. */ui…

使用ElementUI完成登入注册的跨域请求,结合vue-cli搭建的SPA项目,减少冗余代码提升开发效率

目录 一、跨域的概述 ( 1 ) 讲述 ( 2 ) 特点 如何跨域: 二、ElementUI ( 1 ) 导入 ( 2 ) 搭建 ( 3 ) 页面 三、数据交互 ( 1 ) 安装相关模块 安装模块 引用模块 ( 2 ) axios的get请求 ( 3 ) axios的post请求 四、注册功能 带来的收获 一、跨域的概述 …

安卓实现网格布局的效果

文章目录 页面子项布局 Activity适配器 运行结果其他文章 页面 RecyclerView是Android开发中常用的列表控件之一&#xff0c;可以用于展示大量数据以及实现各种布局效果。本文章使用RecyclerView的GridLayoutManager来实现网格布局&#xff0c;显示指定列数。 首先&#xff0c…

25. 图论 - 路径和算法

文章目录 拓展:顶点和边的互换最短路径问题Dijkstra算法Hi, 你好。我是茶桁。 在充分了解图的概念,构成以及种类之后,我们要开始进入稍微有点难度的部分了。这节课,咱们来了解一下路径和Dijkstra算法。 拓展:顶点和边的互换 在这节课正式开始之前,我们对上一节课稍微扩…

Java笔记:认识运行时数据区

1. 运行时数据区概述 1.1 JVM运行时数据区规范 JVM虚拟机组成&#xff1a;方法区(类信息)、堆(伊甸园、老年代、永久代:new的对象等)、虚拟机栈、程序计数器、本地方法栈1.方法区和堆是内存共享的 2.虚拟机栈、本地方法栈、程序计数器是内存不共享的3.方法区&#xff1a;类信息…

描述符——接口描述符

描述符定义 描述符实现 /*** brief USB interface descriptor.*/ typedef struct __attribute__ ((packed)) {uint8_t bLength ; /**< Size of this descriptor in bytes. */uint8_t bDescriptorType ; /**< INTERFACE Descriptor Type. */uint8_t bIn…

MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)

目录 索引语法 创建索引 查看索引 删除索引 案例演示 SQL性能分析 SQL执行频率 慢查询日志 索引语法 创建索引 CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name,... ) ; 查看索引 SHOW INDEX FROM table_name ; 删除索引 DROP INDEX …

AD拼板技巧

AD拼板设置 如图&#xff0c;有一个需要拼板的PCB&#xff0c;想要在生产是拼接生产&#xff0c;节省材料。 操作如下&#xff1a; 1、全选如下&#xff0c;按复制CtrlC。 2、把输入法调整至英文&#xff0c;按快捷键E&#xff08;先&#xff09;&#xff0c; A&#xff08;后…

开发工具MobaXterm(终极终端)

MobaXterm 又名 MobaXVT&#xff0c;是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。 常用SSH客户端介绍&#xff1a; SSH 为 Secure Shell 的缩写&#xff0c;是目前较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有…

【1993. 树上的操作】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点&#xff0c;所以 par…

C++中的Template

模板的概念 建立通用的模具&#xff0c;大大提高复用性 模板不可直接使用 函数模板 函数模板语法 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template&l…

小程序社区团购demo

概述 实现了用户登录或者手机号&#xff0c;加入团长&#xff0c;邀请团长&#xff0c;各种佣金明细等页面 详细 需求&#xff1a; 根据市场信息反馈&#xff0c;社区团购比较火&#xff0c;有流量的用户可以推广页面 实现了功能&#xff1a; 实现了用户微信登录自动获取…

vue之 h() 函数

前言 Vue推荐在绝大数情况下使用模板来创建HTML&#xff0c;然后一些特殊的场景&#xff0c;你真的需要JavaScript的完全编程的能力&#xff0c;这个时候你可以使用渲染函数 &#xff0c;它比模板更接近编译器&#xff1b; h()函数是什么 Vue在生成真实的DOM之前&#xff0c…