码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 特殊类的设计


    前言: 

            在C++中有很多关于类的知识,学习并且掌握它们是我们学习C++的重要的一步,怎么检测自己掌握了这些知识呢?请看看尝试解决下面这些问题。

    目录

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

    2.请设计一个类,只能在堆上创建对象

    3.请设计一个类,只能在栈上创建空间  

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

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


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

            拷贝只会发生在两个场景下,赋值和拷贝构造,因此想要一个类禁止拷贝,只需要让这个类不能调用拷贝构造和赋值运算符重载即可。 

            在C++98中:会采取拷贝构造函数,和operator=函数私有化的方法来解决这个问题。

             

    1. using namespace std;
    2. class CopyBan
    3. {
    4. public:
    5. CopyBan(int a = 0)
    6. :_a(a)
    7. { }
    8. //...其它实现
    9. private:
    10. CopyBan(const CopyBan&);
    11. CopyBan& operator=(const CopyBan&)
    12. {}
    13. int _a = 0;
    14. };
    15. int main()
    16. {
    17. CopyBan cp;
    18. //拷贝和赋值都会报错
    19. CopyBan cp1(cp);
    20. CopyBan cp2;
    21. cp2 = cp;
    22. return 0;
    23. }

            在C++11中采用关键字delete。 

            

    1. class CopyBan
    2. {
    3. public:
    4. CopyBan(int a = 0)
    5. :_a(a)
    6. { }
    7. //...其它实现
    8. //C++11采用delete关键字
    9. CopyBan(const CopyBan&) = delete;
    10. CopyBan& operator=(const CopyBan&) = delete;
    11. private:
    12. int _a = 0;
    13. };

    2.请设计一个类,只能在堆上创建对象

            实现方式:

            1.将类的构造函数和拷贝构造函数私有化,防止别人调用它们在其它地方偷偷开辟空间。         

            2.提供一个静态的成员函数,该静态成员函数完成对象在堆上开辟空间的任务。

    1. class HeapOnly
    2. {
    3. public:
    4. static HeapOnly* CreateObject()
    5. {
    6. return new HeapOnly;
    7. }
    8. HeapOnly(const HeapOnly&) = delete;
    9. HeapOnly& operator=(const HeapOnly&) = delete;
    10. private:
    11. HeapOnly(int a = 10)
    12. :_a(a)
    13. { }
    14. //int _a;
    15. int _a;
    16. };

    3.请设计一个类,只能在栈上创建空间  

            思路:禁用掉拷贝构造,让构造函数私有化,使用静态方法创建对象返回即可。

    1. class StackOnly
    2. {
    3. public:
    4. static StackOnly CreateObject(int a = 0)
    5. {
    6. return StackOnly();
    7. }
    8. private:
    9. StackOnly(int a = 0)
    10. :_a(a)
    11. {}
    12. int _a;
    13. };

            如果只是将operator new定义为已删除函数,不能解决这个问题,因为除了在堆上开辟空间以外,在静态区也是可以开辟对象的。 

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

            C++98的做法,构造函数私有化。

    1. class NonInherit
    2. {
    3. //子类继承父类要调用父类的构造函数,如果将构造函数声明为私有,则子类无法调用
    4. public:
    5. private:
    6. NonInherit(int a = 0)
    7. :_a(a)
    8. { }
    9. int _a;
    10. };

            C++11的做法,采用关键字finial ,final修饰类表示这个类不能被继承

    1. class NonInherit
    2. {
    3. public:
    4. NonInherit(int a = 0)
    5. :_a(a)
    6. { }
    7. private:
    8. int _a;
    9. };

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

            单例模式 

  • 相关阅读:
    【Rust】字符串String类型学习
    【玩转408数据结构】线性表——单链表的定义以及增删改查(线性表的链式表示 上)
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-ChapterB-sed 和 gawk 快速指南
    前端异步+token下载文件
    Python数据类型:数字
    PCL点云处理(008)-euc_cluster
    SpringCloud微服务(五)——Config分布式配置中心
    MySQL——创建视图的注意事项
    21天学习挑战赛之java集合
    向Zookeeper中注册内容以及从zookeeper中发现内容
  • 原文地址:https://blog.csdn.net/m0_68641696/article/details/132764424
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号