C++ 二阶构造模式
1、如何判断构造函数的执行结果?
构造函数没有返回值,所以不能通过返回值来判断是构造函数是否构造成功。
如果给构造函数强行加入一个返回值,用来表示是否构造成功。这样确实能够反映出构造的结果,但是不够优雅,有点呆。
2、在构造函数中执return 会发生什么?
当构造函数中执行return后构造函数直接返回,后面的程序将不能被执行到。这样将产生一个“半成品对象”。
3、构造函数执行结束是否意味着对象构造成功?
如果构造函数中具备申请内存的操作,那么申请内存的操作不可能百分之百成功,所以构造函数执行结束并不意味着构造成功。而声明的对象变成了“半成品对象”
综上所述:
构造函数只能够提供一个自动初始化变量的机会,不能保证初始化逻辑一定成功,执行return语句后构造函数立即结束。(构造函数能够决定的只是对象的初始状态,而不是对象的诞生。)
关于“半成品对象”的概念:
初始化操作不能按照预期的效果完成而得到对象。
半成品对象是合法的C++对象。
二阶构造模式:
所谓二阶构造模式,只是将构造分为两个阶段。
一个阶段为资源无关的初始化操作(例如赋值等不需要访问到系统资源的相关操作。)
第二阶段为与系统资源有关的操作(如申请内存,访问文件)。
二阶构造实验:
#include <stdio.h> class Test
{
private:
int *pData;
int lenght;
Test(int pDataLenght);//第一阶段构造函数
bool construct() ;//第二阶段构造函数
public:
static Test* newInstance(int pDataLenght);//对象创建
bool steData(int pDataTab,int val);//设置参数
bool getData(int pDataTab,int& pDataOut);//获取参数
~Test();
}; Test::Test(int pDataLenght)
{
lenght = pDataLenght;
} Test::~Test()
{
delete[] pData;//释放堆空间内存。
printf("this is Structure analysis function\n");//构析函数 } bool Test::construct()
{
bool ret = true;
pData = new int(lenght);
if(pData)
for(int i=;i<lenght;i++)
pData[i] = ;
else
{
ret = false;
}
return ret;
}
Test* Test::newInstance(int pDataLenght)
{
Test* ret = new Test(pDataLenght);//完成第一阶段构造
if(!(ret && ret->construct()))
{
delete ret;
ret = NULL;
}
return ret;
} bool Test::steData(int pDataTab,int val)
{
bool ret = true;
if(pDataTab>= && pDataTab<lenght)
{
pData[pDataTab] = val;
}
else
ret = false;
return ret; }
bool Test::getData(int pDataTab,int& pDataOut)
{
bool ret = true;
if(pDataTab>= && pDataTab<lenght)
{
pDataOut = pData[pDataTab];
}
else
ret = false;
return ret;
} int main(void) {
Test* obj = Test::newInstance();//使用二阶构造 只能使用静态函数进行创建
obj->steData(, );
for(int i = ;i< ;i++)
{
int temp;
if(obj->getData(i,temp))
printf("%d = %d\n",i,temp);
}
delete obj;
return ;
}
运行结果:
=
=
=
=
=
this is Structure analysis function
C++ 二阶构造模式的更多相关文章
- C++之二阶构造模式
前言:C++中经常会因为调用系统资源失败导致出现BUG,所以在类调用构造函数需要分配系统资源时会出现BUG,从而导致类对象虽然被创建,但是只是个半成品,为了避免这种情况需要使用二阶构造模式 二阶构造模 ...
- C++解析(15):二阶构造模式
0.目录 1.构造函数与半成品对象 2.二阶构造 3.小结 1.构造函数与半成品对象 关于构造函数: 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用 问题 ...
- 14.C++-二阶构造模式、友元(详解)
首先回顾以前所学的构造函数 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在定义时被自动调用 由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功 比如: c ...
- javascript创建对象之函数构造模式和原型模式结合使用(四)
创建自定义类型的常见方式就是组合使用构造函数模式与原型模式一起使用. 构造函数模式用于定义实例对象的特有的部分(属性和方法),原型模式用于定义共享的部分. 这样最大限度的节省了内存的开销. funct ...
- cocos2d-x中的二段构造模式
学习cocos2d-x的过程中,会发现很多对象都通过一个静态函数create来创建.比方以下的一个样例 #define CREATE_FUNC (__TYPE__) \ static __TYPE__ ...
- 谈ObjC对象的两段构造模式
前言 Objective-c语言在申请对象的时,需要使用两段构造(Two Stage Creation)的模式.一个对象的创建,需要先调用alloc方法或allocWithZone方法,再调用init ...
- C++解析(30):关于指针判别、构造异常和模板二义性的疑问
0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...
- C++二阶构造函数
转自:http://blog.51cto.com/9291927/1896411 一.构造函数的问题 构造函数存在问题: A.构造函数只提供自动初始化成员变量的机会 B.不能保证初始化逻辑一定成功,如 ...
- 第50课 关于对话框(About)
1. 关于对话框 (1)标准的桌面应用软件都有一个关于对话框 (2)关于对话框用于标识软件自身的信息.如logo.项目名.版本号.开发者信息.版权信息.联系方式等. 2. 经典设计方案 3. 项目持续 ...
随机推荐
- 20165213 Exp 8 Web基础
Exp 8 Web基础 一.基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器 ...
- Git 推送文件到远程仓库
Configure Git for the first time: git config --global user.name "xxxxx xx"git config --glo ...
- 忘记Linux 3.X/4.x/5.x 宝塔面板密码的解决方案
进入ssh 输入以下命令重置密码(把命令最后面的 “testpasswd” 替换成你要改的新密码)注:若是debian/ubuntu用户,请使用有root权限的账户去执行这条命令 cd /www ...
- Angular5.0之 安装指定版本Angular CLI
我们可能会发现按照网上的方式下载安装后,使用Angular CLI生成的项目并不是我们想要的Angular的版本,因为在我们没有指定安装版本的前提下,默认会下载最新的版本安装,然而不同的Angular ...
- XPATH了解
特殊标签 找SVG这种特殊标签可以使用[name()='svg'],如//[name()='svg']/[name()='line'][2] 文本 找标签内的文本时可以使用: //*[text()=' ...
- mysql 查询锁表,解锁
//1.查看当前数据库锁表的情况 SELECT * FROM information_schema.INNODB_TRX; //2.杀掉查询结果中锁表的trx_mysql_thread_id ...
- 如何修改phpstorm的缓存目录
相信使用phpstorm的人们都被缓存目录的大小困扰过.怎么修改到其它地方呢? 1. 找到 idea.properties 文件,配置信息都在此文件中,F:\Program Files\JetBrai ...
- SVN 撤回(回滚)提交的代码
转: SVN 撤回(回滚)提交的代码 2016年12月20日 17:20:58 怀色 阅读数 68614 标签: svnsvn回滚版本回滚 更多 个人分类: svn 版权声明:本文为博主原创文章, ...
- python格式化字符串format的用法
填充与对齐 填充常跟对齐一起使用 ^.<.>分别是居中.左对齐.右对齐,后面带宽度 :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充 比如 In [15]: '{:> ...
- 【学习笔记】python3中csv文件使用
1. reader=csv.reader(f, delimiter=','):按行读取数据,reader为生成器,读取的每行数据为列表格式,可以通过delimiter参数指定分隔符. import c ...