-
关于构造函数
-
类的构造模式用于对象的初始化
-
构造模式与类同名并且没有返回值
-
构造函数在对象定义时自动被调用
-
问题
-
如何判断构造函数的执行结果?
-
在构造函数中执行return语句会发生什么?
-
构造函数执行结果意味着对象构造成功?
1 #include <stdio.h> 2 class Test 3 { 4 private: 5 int mi; 6 int mj; 7 bool mStatus; 8 public: 9 Test(int i,int j):mStatus(false) 10 { 11 mi = i; 12 return; 13 mj = j; 14 mStatus = true; 15 } 16 int getI() 17 { 18 return mi; 19 } 20 int getJ() 21 { 22 return mj; 23 } 24 int status() 25 { 26 return mStatus; 27 } 28 }; 29 int main() 30 { 31 Test t(1,2); 32 if(t.status()) 33 { 34 printf("t.mi=%d ",t.getI()); 35 printf("t.mj=%d ",t.getJ()); 36 } 37 return 0; 38 }
- 构造函数
-
只提供自动初始化成员变量的机会
-
不能保证初始化逻辑一定成功
-
执行return语句后构造函数立即结束
构造函数能决定的只是对象的初始状态,而不是对象的诞生。
-
半成品对象的概念
-
初始化操作不能按照预期完成而得到的对象
-
半成品对象是合法的C++对象,也是bug的重要来源。
-
工程开发中的构造过程可分为:
-
资源无关的初始化操作,不可能出现异常情况的操作。
-
需要使用系统资源的操作,可能出现异常情况,如:内存申请(new),访问文件。
-
二阶构造模式
-
所谓二阶构造 就是将对象的构造分为两个部分
-
第一部分:与资源无关的初始化,如对象中初始值的设置。
-
第二部分:与资源有关的初始化,如内存资源的申请,文件的访问等。
1 #include <stdio.h> 2 class TwoPhaseCons 3 { 4 private: 5 //第一阶段构造函数 6 TwoPhaseCons() 7 { 8 } 9 //第二阶段构造函数 10 bool construct() 11 { 12 return true; 13 } 14 public: 15 //对象创建函数 16 static TwoPhaseCons*NewInstance(); 17 }; 18 //内部静态成员函数直接访问私有成员是合法的 19 TwoPhaseCons* TwoPhaseCons::NewInstance() 20 { 21 //通过动态内存分配创建一个对象,构造函数 22 //肯定会调用,执行第一阶段的构造函数 23 TwoPhaseCons*ret = new TwoPhaseCons(); 24 //执行第二阶段构造函数 25 if(!(ret && ret->construct())) 26 { 27 delete ret; 28 ret = NULL; 29 } 30 return ret; 31 } 32 int main() 33 { 34 //因为构造函数是私有的,所以想用类名直接定义一个对象是不合法的 35 //在main函数中,无法访问类中的私有成员,所以可以在静态成员函数中 36 //访问类中的私有成员 37 //在堆空间中可以生成一个合法的,可以使用的对象 38 TwoPhaseCons*obj = TwoPhaseCons::NewInstance(); 39 printf("obj = %p ",obj); 40 return 0; 41 }
小结:
-
构造函数只能决定对象的初始化状态
-
构造函数中初始化操作的失败不影响对象的诞生
-
初始化不完全的半成品对象是bug的重要来源
-
二阶构造人为的将初始化过程分为两部分
-
二阶构造能够确保创建的对象是完整初始化的