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. 项目持续 ...
随机推荐
- tomcat配置加密的连接器https
对称加密:加密和解密用的是同样的密钥. 非对称加密:使用一对密钥,公钥和私钥,私钥只由一方保管,不能外泄:公钥可以发给任何请求它的人 那么得到公钥的一方怎么确定这个公钥是服务器发过来的呢? 这个就需要 ...
- (十九)C语言之指针
- 我的Linux vim配置文件
map <F9> :call SaveInputData()<CR> func! SaveInputData() exec "tabnew" exec 'n ...
- [转]java常量池理解总结
一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...
- mysql密码忘记更改
忘记mysql的密码是一件不好的事,通常我们会把密码记住,或者是存在文档中,避免忘记,如果忘记了密码可以参照下方方法来更改,这个操作需要重启mysql. 首先我们在my.cnf文件中的[mysqld] ...
- ssh 远程登录错误
错误信息: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATI ...
- python操作轻量级数据库
1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~ import sqlite3 2. 创建/打开数据库 ...
- javascript中 if条件语句中的判断条件类型总结
在所有编程语言中if是最长用的判断之一,但在js中到底哪些东西可以在if中式作为判断表达式呢? 例如如何几行,只是少了一个括号,真假就完全不同,到底表示什么含义呢 var obj={}; obj.Fu ...
- 类属性与对象实现,init方法的作用,绑定方法,绑定方法与普通函数的区别,继承,抽象与继承,派生与覆盖
今日内容: 1.类属性与对象属性 2.init方法的作用 3.绑定方法 4.绑定方法与普通函数的区别(非绑定方法) 5.继承 6.抽象与继承 7.派生与覆盖 1.类属性与对象属性 类中应该进存储所有对 ...
- Ciso三层交换 上vlan间互通, 端口映射到vlan
路由器2911配置: !hostname router interface GigabitEthernet0/0 ip address 10.0.0.2 255.0.0.0 ip nat outsid ...