详解c++——二阶构造模式,友元

  

首先回顾以前所学的构造函数

  
      <李>类的构造函数用于对象的初始化李   <李>构造函数与类同名并且没有返回值   <李>构造函数在定义时被自动调用李   
  

由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功

  

比如:         类测试{      私人:   int * p;      公众:   测试(int i)   {   p=new int(我);   }      }      

假如创建对象时,执行新分配时失败了,便会出现错误,若代码量大,是很难找到这个问题的,这种便被称为半成品对象。

  

如何来避免半成品对象的诞生呢?

  

就要用到本章学的二阶构造了。

  

二阶构造

  

将构造过程分为两步

  

——资源无关的初始化操作

  

指不可能出现异常情况的操作,比如:初始化int, flaot等普通变量

  

- - - - - -需要使用系统资源的操作

  

指可能出现异常情况的操作,比如:内存申请,访问文件等

  

如下图所示:

  

详解c++——二阶构造模式,友元

  

步骤如下:

  

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++——二阶构造模式,友元