国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++-二階構造模式、友元

2020-01-26 13:30:12
字體:
來源:轉載
供稿:網友

首先回顧以前所學的構造函數

  1. 類的構造函數用于對象的初始化
  2. 構造函數與類同名并且沒有返回值
  3. 構造函數在定義時被自動調用

由于構造函數沒有返回值不能判斷執行結果,所以不能保證初始化對象能否成功

比如:

class Test{ private:  int *p; public:  Test(int i)  {   p=new int(i);  } }

假如創建對象時,執行new分配時失敗了,便會出現bug,若代碼量大,是很難找到這個問題的,這種便被稱為半成品對象.

如何來避免半成品對象的誕生呢?

就要用到本章學的二階構造了.

二階構造

將構造過程分為兩步

-資源無關的初始化操作

指不可能出現異常情況的操作,比如:初始化int,flaot等普通變量

-需要使用系統資源的操作

指可能出現異常情況的操作,比如:內存申請,訪問文件等

如下圖所示:

步驟如下:

1.創建一個私有的構造函數,由于構造函數沒有返回值,所以用來進行第一階段構造

2.創建一個私有的有返回值函數,用來進行第二階段構造,構造成功返回true,失敗返回false

3.最后創建一個靜態成員函數,通過new創建一個對象,然后調用1和2步驟的函數,最后進行判斷處理

參考以下示例:

#include <stdio.h> class TwoPhaseCons{private:  TwoPhaseCons()    // 第一階段構造函數   { }   bool construct()     // 第二階段構造函數  {    return true;  } public:  static TwoPhaseCons* NewObj(); // 對象創建函數 };  TwoPhaseCons* TwoPhaseCons::NewObj(){  TwoPhaseCons* ret = new TwoPhaseCons();   // 若第二階段構造失敗,返回 NULL   if( !(ret && ret->construct()) )  {    delete ret;    ret = NULL;  }   return ret;}  int main(){  TwoPhaseCons* obj = TwoPhaseCons::NewObj();   printf("obj = %p/n", obj);   delete obj;   return 0;}

C++友元

什么是友元?

由于C++的類具有封裝性,在外部無法訪問到類的private私有成員,所以友元就誕生了

-類的友元可以是函數,也可以是另一個類

比如:Test類的友元是個func()函數,則func()函數就能訪問Test類的任何成員變量(包括靜態,私有,共有等)

-友元的好處在于,方便快捷.

-友元的壞處在于,破壞了面向對象的封裝性,在現代已經逐漸被遺棄

友元定義,是在類中使用friend關鍵字來聲明,比如:

class Test{   friend void f_func(const Test& t);    //聲明f_func()是該類的友元}; void f_func(const Test& t){    ... ...         //可以訪問 Test類 對象t 里的任何成員變量}

示例1

通過Test類的友元(函數)來訪問成員變量,代碼如下:

#include "stdio.h" class Test{ private:    static int n;    int x;    int y; public:    Test(int x,int y)    {       this->x = x;       this->y = y;    }       friend void f_func(const Test& t);     //聲明Test的友元是f_func()函數 }; int Test::n = 3;  void 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(){    Test t1(1,2);    f_func(t1);    return 0;} 

運行打印:

t.x=1
t.x=2
t.x=3

示例2

通過A類的友元(B類)來訪問成員變量,代碼如下:

#include "stdio.h" class A{    int i;    int j; public:    A()    {     i=10;     j=20;    }     friend class B;    //聲明A的友元是B}; class B{ public:    void accessA(const A& t)    {     printf("t.i=%d/n",t.i);     printf("t.j=%d/n",t.j);      } }; int main(){  A t1;  B t2;   t2.accessA(t1);   return 0;} 

運行打印:

t.i=10
t.j=20

以上所述是小編給大家介紹的C++二階構造模式、友元詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苍南县| 阳江市| 临夏县| 沭阳县| 项城市| 丹棱县| 高雄县| 临猗县| 清河县| 桂东县| 靖西县| 青浦区| 泾阳县| 林州市| 靖远县| 阿图什市| 永登县| 马尔康县| 宜君县| 墨竹工卡县| 海丰县| 商南县| 静海县| 彰化县| 万山特区| 鄱阳县| 博兴县| 安陆市| 莱西市| 安溪县| 城口县| 盐山县| 宜宾市| 大方县| 登封市| 天镇县| 厦门市| 当雄县| 麻城市| 安塞县| 宁化县|