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. HNOI2015菜肴制作

    一开始,没想出来,先topsort判环,把impossible拿到手,然后划分联通块,对每个联通块跑一遍topsort,觉得可对了,然后被大样例教育明白了,知道自己的策略错在哪了. 接着在纸上疯狂手模 ...

  2. TCP之11种状态变迁

    1. TCP 之11种状态变迁 TCP 为一个连接定义了 11 种状态,并且 TCP 规则规定如何基于当前状态及在该状态下所接收的分节从一个状态转换到另一个状态.如,当某个应用进程在 CLOSED 状 ...

  3. Linux搭建PHP环境(LAMP)

    //安装Apache的命令 # yum install httpd //启动Apache的命令 # service httpd start //安装MySQL的命令 # wget http://dev ...

  4. 提问(prompt)

    prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, str2); 参数说明: str1: ...

  5. 3.MapReduce原理和Yarn

    1.MapReduce原理 2.MapReduce执行时间 3.MapReduce开发 4.Yarn

  6. SQL Server 数据库设计、命名、编码规范

    https://blog.csdn.net/songguozhi/article/details/5858159 SQL Server 数据库设计.命名.编码规范

  7. LC 962. Maximum Width Ramp

    Given an array A of integers, a ramp is a tuple (i, j) for which i < j and A[i] <= A[j].  The ...

  8. 如何在GitHub上下载一部分文件(单个文件夹)

    Preface Github下的项目可能很大,里面有很多的子文件夹,我们可能只需要使用某个子目录下的资源,可以不用下载完整的repo就能使用. 例如,我想下载这个repo中的mnist_gan文件:h ...

  9. 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架

    需要先搭建Mybits的环境. 用Mybits的注解的方式.把两个方法的sql语句写完 SqlMapConfig.xml resources下新建xml文档 把约束粘贴过来 两步操作 环境标签叫做en ...

  10. Win10资源管理器始终使用详细视图模式

    Win10系统中使用资源管理器时,如果文件夹里有音乐文件就自动切换视图模式为音乐模式,这样有时确实很头疼,看不到文件的大小等信息. 解决的办法如下: 新创建FolderType = NotSpecif ...