二阶构造设计模式

目录

构造函数回顾

深入思考

实验

构造函数的真相

半成品对象

引入二阶构造设计模式

设计理念

二阶构造设计模式图

二阶构造示例

完整demo

小结


构造函数回顾

  1. 类的构造函数用于对象的初始化。
  2. 构造函数与类同名并且没有返回值。
  3. 构造函数在对象定义时自动被调用

深入思考

  1. 如何判断构造函数的执行结果?
  2. 在构造函数中执行 return 语句会发生什么?
  3. 构造函数执行结束是否意味着对象构造成功?

实验

test.cpp

#include <stdio.h>class Test
{private:int mi;int mj;public:Test(int i,int j){mi=i;mj=j;}int getI(){return mi;}int getJ(){return mj;}
};int main()
{Test t1(1,2);printf("t1.mi = %d\n",t1.getI());printf("t1.mj = %d\n",t1.getJ());return 0;
}

编译运行,实验结果符合预期。

delphi@delphi-vm:~/c_c++$ g++ test.cpp -o test.out
delphi@delphi-vm:~/c_c++$ ./test.out 
t1.mi = 1
t1.mj = 2

接下来在构造函数中,加入 return语句,实验结果如下所示:

test.cpp

#include <stdio.h>class Test
{private:int mi;int mj;public:Test(int i,int j){mi=i;return ;mj=j;}int getI(){return mi;}int getJ(){return mj;}
};int main()
{Test t1(1,2);printf("t1.mi = %d\n",t1.getI());printf("t1.mj = %d\n",t1.getJ());return 0;
}

编译运行,实验结果如下,可以看到 mj的值为随机数了。

delphi@delphi-vm:~/c_c++$ g++ test.cpp -o test.out
delphi@delphi-vm:~/c_c++$ ./test.out 
t1.mi = 1
t1.mj = 12783604

以上结果,可以看到:构造函数出现问题了,但是对象依旧诞生了,那么这个对象是一个合法的对象吗?

构造函数的真相

  1. 构造函数只提供自动初始化成员变量的机会。
  2. 构造函数不能保证初始化逻辑一定会成功。
  3. 执行 return 语句后构造函数立即结束。
  4. 构造函数能决定的只是对象的初始状态,而不能决定对象是否诞生。

半成品对象

  1. 初始化操作不能按照预期完成而得到的对象。
  2. 半成品对象是合法的C++对象,也是Bug的重要来源。

引入二阶构造设计模式

设计理念

工程开发中的构造过程可以分为:

        一:资源无关的初始化操作

                不可能出现异常情况的操作

        二:需要使用系统资源的操作

                可能出现异常情况,如:内存申请,访问文件

二阶构造设计模式图

从设计层面,将构造过程一分为二,第一阶段的构造做资源无关的操作,第二阶段做资源申请的操作。用二阶设计模式要么产生一个完整合法的C++对象,要么直接返回NULL,不会产生一个半成品的C++对象。

二阶构造示例

class TwoPhaseCons
{private:TwoPhaseCons(){  //第一阶段的构造函数}bool construct(){ //第二阶段的构造函数}public:static TwoPhaseCons* NewInstance(); //创建对象函数
};

TwoPhaseCons* TwoPhaseCons::NewInstance()
{TwoPhaseCons* ret = new TwoPhaseCons();//如果第二阶段构造失败,返回NULLif(!(ret && ret->construct())){delete ret;ret = NULL;}return ret;
}

完整demo

#include <stdio.h>class TwoPhaseCons
{private:TwoPhaseCons()   //第一阶段的构造函数{  //做资源无关的初始化的操作}bool construct()  //第二阶段的构造函数{ //做内存申请、打开文件的操作return true;}public:static TwoPhaseCons* NewInstance(); //创建对象函数
};TwoPhaseCons* TwoPhaseCons::NewInstance()
{TwoPhaseCons* ret = new TwoPhaseCons();//如果第二阶段构造失败,返回NULLif(!(ret && ret->construct())){delete ret;ret = NULL;}return ret;
}int main(int argc,char* argv[])
{TwoPhaseCons* obj = TwoPhaseCons::NewInstance();printf("obj = %p\n",obj);delete obj;return 0;
}

小结

  1. 构造函数只能够决定对象的初始化状态。
  2. 构造函数中初始化操作的失败不影响对象的诞生。
  3. 初始化不完全的半成品对象是Bug的重要来源。
  4. 二阶构造人为的将初始化过程分为两部分。
  5. 二阶构造能够确保创建的对象都是完整初始化的。

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

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

相关文章

iphone 5s的充电时序原理图纸,iPAD充电讲解

上一篇写了iphone 5的时序。那是电池供电的开机时序。iphone 5s也是差不多的过程&#xff0c;不说了。现在看iphone5s手机充电时候的时序。iphone5s充电比iphone5充电简单了很多。 首先是usb接口接到手机上&#xff0c;usb线连接到J7接口上。J7接口不只是接usb&#xff0c;还能…

[bat批处理] 一键清理 Windows10 系统垃圾

文章目录 &#x1f680;使用批处理一键清理 Windows10 系统垃圾&#x1f528;编写批处理文件 &#x1f680;使用批处理文件&#x1f528;注意事项&#x1f680;总结 &#x1f680;使用批处理一键清理 Windows10 系统垃圾 Windows10 系统在使用过程中会产生大量的临时文件、日志…

基于YOLOv8深度学习的苹果叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

引领未来:话务数据展示大屏助力企业决策

在当今信息爆炸的时代&#xff0c;企业需要一个直观、高效的数据展示平台来帮助他们快速获取、分析和决策。山海鲸可视化话务数据展示大屏&#xff0c;就是这样一款引领企业迈向高效决策新纪元的产品。 一、什么是山海鲸可视化话务数据展示大屏&#xff1f; 山海鲸可视化是一款…

【不用找素材】ECS 游戏Demo制作教程(1) 1.15

一、项目设置 版本&#xff1a;2022.2.0f1 &#xff08;版本太低的话会安装不了ECS插件&#xff09; 模板选择3D URP 进来后移除URP&#xff08;因为并不是真的需要&#xff0c;但也不是完全不需要&#xff09; Name: com.unity.entities.graphics Version: 1.0.0-exp.8 点击…

HTML概述、基本语法(表格整理、标签、基本结构)

一、HTML概述 HTML指的是超文本标记语言 超文本&#xff1a;是指页面内可以包含图片、链接、声音、视频等内容 标记&#xff1a;标签&#xff08;通过标记符号来告诉浏览器页面该如何显示&#xff09; 我们可以打开浏览器&#xff0c;右击页面&#xff0c;点击查看网页源代码&…

Java队列-Disruptor 的使用

一、什么是 Disruptor 从功能上来看&#xff0c;Disruptor 是实现了“队列”的功能&#xff0c;而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。 可以拿 JDK 的 BlockingQueue 做一个简单对比&#xff0c;以便更好地认识 Disruptor 是什么…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…

书生·浦语大模型--第二节课作业

书生浦语大模型--第二节课作业 基础部分生成300字小故事hugging face 下载功能 进阶部分浦语灵笔的图文理解及创作部署Lagent 工具调用 Demo 创作部署 基础部分 生成300字小故事 hugging face 下载功能 hugging face被墙了&#xff0c;在本地电脑无论是不是科学上网&#xff…

STM32 定时器输入捕获2——捕获高电平时长

由上图我们可以知道&#xff0c;高电平时间t2-t1。在代码中&#xff0c;可以记录此时t1的时间然后再记录t2的时间&#xff0c;t2-t1&#xff0c;就是我们所想要的答案。 但是&#xff0c;还有更简单一点点的&#xff0c;当到达t1的时候&#xff0c;我们把定时器清零&#xff0c…

现代工程科技杂志现代工程科技杂志社现代工程科技编辑部2023年第21期目录

能源科技 配网故障停电原因及改进对策研究 上官安琪 110kV变电站电气自动化技术及应用策略 陈祥 变电运维误操作事故预控措施分析 高翔;韦婉 智能变电站变电运维安全与设备维护探究 温亮亮;覃万全 110kV变电站电气设计及其防雷保护案例研析 谢旭平 变电运维…

解决哈希冲突的几种方法

什么是hash冲突 哈希函数是一个映像&#xff0c;把任意长度的输入&#xff0c;通过Hash算法变换成固定长度的输出&#xff0c;这个输出就是Hash值&#xff1b; 当两个不同的输入&#xff0c;产生了同一个输出值即为哈希冲突 解决方式 开放定址法 开放寻址法的核心思想是&am…

微信小程序---如何创建分包

1.在项目根目录中&#xff0c;创建分包的根目录&#xff0c;名为subpkg&#xff0c;这个名字可以自己定义 2.在 pages.json 中&#xff0c;和 pages 节点平级的位置声明 subPackages 节点&#xff0c;用来定义分包相关的结构&#xff1a; 3.在分包目录&#xff0c;点击右键新建…

Python UI框架库之kivy使用详解

概要 Python是一种广泛使用的编程语言&#xff0c;而Kivy是一个用于创建跨平台移动应用和多点触控应用的开源Python框架。Kivy的设计目标是提供一种简单而强大的方式来构建富有创意的用户界面和交互体验。本文将详细介绍Kivy的基本概念、核心特性、布局系统、用户界面设计和实…

[zabbix] zabbix监控其他

一、温习zabbix自定义监控 二、zabbix 自动发现与自动注册 2.1 zabbix 自动发现 //zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数…

Android系统开发之浅谈广播接收器回调

广播接器BroadcastReceiver 广播Intent和广播接收器BroadcastReceiver&#xff0c;是大家android开发用的特别多的二个控件。 那如何从系统角度看待广播和广播接收器呢&#xff1f; 对于静态注册BroadcastReceiver和动态注册的BroadcastReceiver是如何回调其onReceive方法呢…

安全帽/反光衣检测AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;硬件内置了近40种AI算法模型&…

MySQL索引和视图基础练习题

一、创建表的要求 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名Cno为主键 学生选课表&#xff1a;SC (S…

C++(1) —— 基础语法入门

目录 一、C初识 1.1 第一个C程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 二、数据类型 2.1 整型 2.2 sizeof 关键字 2.3 实型&#xff08;浮点型&#xff09; 2.4 字符型 2.5 转义字符 2.6 字符串型 2.7 布尔类型 bool 2.8 数据的输入 三…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子排行实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…