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. 0.spring cloud目录

    1. 微服务架构概述 1.0. 单体架构是什么 1.1. 单体应用架构存在的问题 1.2. 如何解决单体应用架构存在的问题 1.3. 什么是微服务 1.4. 微服务架构的优点与挑战 1.4.1. 微服 ...

  2. LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  3. 黑马lavarel教程---12、lavarel验证码

    黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...

  4. Redis内存满了的几种解决方法(内存淘汰策略与Redis集群)

    1,增加内存: 2,使用内存淘汰策略. 3,Redis集群. 重点介绍下23: 第2点: 我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节). 那么当所需内存 ...

  5. jmeter beanShell修改http请求参数

    jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...

  6. SAS数据挖掘实战篇【三】

    SAS数据挖掘实战篇[三] 从数据挖掘概念到SAS EM模块和大概的流程介绍完之后,下面的规划是[SAS关联规则案例][SAS聚类][SAS预测]三个案例的具体操作步骤,[SAS的可视化技术]和[SA ...

  7. mysql 索引失效的几种情况+

  8. 图片和Base64字符串互转

    图片URL转成Base64字符串 /// <summary> /// 通过Url获取到Image格式的文件 /// </summary> /// <param name= ...

  9. Appium-实战之启动App 获取信息说明

    如下为启动 格来云游戏APP启动信息 代码如下: from appium import webdriver caps = {} caps["platformName"] = &qu ...

  10. 【PP系列】SAP PP模块工作中心主数据维护

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[PP系列]SAP PP模块工作中心主数据维护 ...