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++ 二阶构造模式的更多相关文章

  1. C++之二阶构造模式

    前言:C++中经常会因为调用系统资源失败导致出现BUG,所以在类调用构造函数需要分配系统资源时会出现BUG,从而导致类对象虽然被创建,但是只是个半成品,为了避免这种情况需要使用二阶构造模式 二阶构造模 ...

  2. C++解析(15):二阶构造模式

    0.目录 1.构造函数与半成品对象 2.二阶构造 3.小结 1.构造函数与半成品对象 关于构造函数: 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用 问题 ...

  3. 14.C++-二阶构造模式、友元(详解)

    首先回顾以前所学的构造函数 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在定义时被自动调用 由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功 比如: c ...

  4. javascript创建对象之函数构造模式和原型模式结合使用(四)

    创建自定义类型的常见方式就是组合使用构造函数模式与原型模式一起使用. 构造函数模式用于定义实例对象的特有的部分(属性和方法),原型模式用于定义共享的部分. 这样最大限度的节省了内存的开销. funct ...

  5. cocos2d-x中的二段构造模式

    学习cocos2d-x的过程中,会发现很多对象都通过一个静态函数create来创建.比方以下的一个样例 #define CREATE_FUNC (__TYPE__) \ static __TYPE__ ...

  6. 谈ObjC对象的两段构造模式

    前言 Objective-c语言在申请对象的时,需要使用两段构造(Two Stage Creation)的模式.一个对象的创建,需要先调用alloc方法或allocWithZone方法,再调用init ...

  7. C++解析(30):关于指针判别、构造异常和模板二义性的疑问

    0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4 ...

  8. C++二阶构造函数

    转自:http://blog.51cto.com/9291927/1896411 一.构造函数的问题 构造函数存在问题: A.构造函数只提供自动初始化成员变量的机会 B.不能保证初始化逻辑一定成功,如 ...

  9. 第50课 关于对话框(About)

    1. 关于对话框 (1)标准的桌面应用软件都有一个关于对话框 (2)关于对话框用于标识软件自身的信息.如logo.项目名.版本号.开发者信息.版权信息.联系方式等. 2. 经典设计方案 3. 项目持续 ...

随机推荐

  1. 对HTML中P标签的思考

    这几天在用VUE-CLI做一个demo,然后在渲染一个列表的时候遇到了一个挺不可思议的事情: <!--这只是一小部分,v-for的内容在上方--> <div class=" ...

  2. b+tree索引在MyIsam和InnoDB的不同实现方式

    普通二叉搜索树当索引的劣势: (1)每个节点占用的空间太少,不能很好的利用磁盘的预读性 (2)数据不规律的话,很可能形成链表 (3)频繁IO b树当索引机制相比于二叉树的优势和劣势: (1)每个节点有 ...

  3. *CodeIgniter框架集成支付宝即时到账SDK

    客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...

  4. mysql删除数据库所有表

    -- 生成删除xxx数据库的所有表的sql语句SELECT CONCAT('drop table ',table_name,';') FROM information_schema.`TABLES` ...

  5. GitHub:Youtube

    ylbtech-GitHub:Youtube 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 1. https://github.com/youtube 2.   ...

  6. oracle imp 工具可能出现的问题

  7. iOS UItextView监听输入特定字符跳转页面选择选项返回

    今天有朋友问我一个需求的实现,于是自己写了一个Demo简单的实现了一下: 需求是: 1>比如: 检测用户输入"A"字符串,跳转页面选择选项,将选择的选项放置textView里 ...

  8. MUT值设置、top等命令无法执行、ssh无法登陆、vim命令卡住

    [root@host---- ~]# ifconfig eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu inet 10.1.1.204 n ...

  9. laravel 5.8 实现消息推送

    以下教程是基于5.6 的,在使用5.8实现时遇到一些问题,做一下记录 在我看来,实时通信才是 APP 应用的将来. Socket 服务通常不是那么容易实现,但是 Laravel Echo 服务改变了这 ...

  10. BCP 数据导出

    EXEC master..xp_cmdshell 'BCP test.dbo.name out d:\t_002.txt -c -t -T' EXEC master..xp_cmdshell 'BCP ...