首先回顾以前所学的构造函数
-
<李>类的构造函数用于对象的初始化李>
<李>构造函数与类同名并且没有返回值李>
<李>构造函数在定义时被自动调用李>
由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功
比如:
类测试{ 私人: int * p; 公众: 测试(int i) { p=new int(我); } }
假如创建对象时,执行新分配时失败了,便会出现错误,若代码量大,是很难找到这个问题的,这种便被称为半成品对象。
如何来避免半成品对象的诞生呢?
就要用到本章学的二阶构造了。
二阶构造
将构造过程分为两步
——资源无关的初始化操作
指不可能出现异常情况的操作,比如:初始化int, flaot等普通变量
- - - - - -需要使用系统资源的操作
指可能出现异常情况的操作,比如:内存申请,访问文件等
如下图所示:
步骤如下:
1。创建一个私有的构造函数,由于构造函数没有返回值,所以用来进行第一阶段构造
2。创建一个私有的有返回值函数,用来进行第二阶段构造,构造成功返回真,失败返回假
3。最后创建一个静态成员函数,通过新的创建一个对象,然后调用1和2步骤的函数,最后进行判断处理
参考以下示例:
# include & lt; stdio.h> 类TwoPhaseCons { 私人://第TwoPhaseCons()一阶段构造函数 {} bool构造()//第二阶段构造函数 { 返回true; } 公众: 静态TwoPhaseCons * NewObj ();//对象创建函数 }; TwoPhaseCons * TwoPhaseCons:: NewObj () { TwoPhaseCons * ret=new TwoPhaseCons ();//若第二阶段构造失败,返回零 如果(! (ret,,ret→构造())) { 删除受潮湿腐烂; ret=零; } 返回受潮湿腐烂; } int main () { TwoPhaseCons * obj=TwoPhaseCons: NewObj (); printf (" obj=% p \ n ", obj); 删除obj; 返回0; }
c++友元
什么是友元?
由于c++的类具有封装性,在外部无法访问到类的私有私有成员,所以友元就诞生了
——类的友元可以是函数,也可以是另一个类
比如:测试类的友元是个func()函数,则函数()函数就能访问测试类的任何成员变量(包括静态,私有,共有等)
——友元的好处在于,方便快捷。
——友元的坏处在于,破坏了面向对象的封装性,在现代已经逐渐被遗弃
友元定义,是在类中使用朋友关键字来声明,比如:
类测试{ 朋友空白f_func (const Test&t);//声明f_func()是该类的友元 }; 空白f_func (const Test&t) { ……//可以访问测试类对象t里的任何成员变量 }
示例1
通过测试类的友元(函数)来访问成员变量,代码如下:
# include“stdio . h” 类测试{ 私人: 静态整数n; int x; int y; 公众: 测试(int x, int y) { 这个→x=x; 这个→y=y; } 朋友空白f_func (const Test&t);//声明测试的友元是f_func()函数 }; 智力测试::n=3; 空白f_func (const Test&t) { printf (" t.x=% d \ n”, t.x); printf (" t.y=% d \ n”, t.y); printf (" t.n=% d \ n”, t.n);//访问私有静态成员变量 } int main () { 测试t1 (1、2); f_func (t1); 返回0; }
运行打印:
t。x=1
引用>
t。x=2
t.x=3示例2
通过一个类的友元(B类)来访问成员变量,代码如下:
# include“stdio . h” A类{ int我; int j; 公众: 一() { 我=10; j=20; } 朋友B类;//声明一个的友元是B }; B类{ 公众: 通道口无效(const第一部;t) { printf (" t.i=% d \ n”, t.i); printf (" t.j=% d \ n”, t.j); } }; int main () { t1; B t2; t2.accessA (t1); 返回0; }详解c++——二阶构造模式,友元