天天看點

C++ 嵌套類使用(三)

如果嵌套類型和其外部類型之間的關系需要成員可通路性語義,需要使用C++嵌套類,嵌套類型不應針對其聲明類型以外的類型執行任務,而C++局部類允許類、結構和接口被分成多個小塊兒并存儲在不同的源檔案中,這樣的實作很容易開發和維護。

C++局部類:

在一個函數體内定義的類稱為局部類。局部類中隻能使用它的外圍作用域中的對象和函數進行聯系,因為外圍作用域中的變量與該局部類的對象無關(#add,這半句是什麼屁話?)。局部類不能被外部所繼承。在定義局部類時需要注意:局部類中不能說明靜态成員函數,并且所有成員函數都必須定義在類體内(#add,因為除此之外沒有别的地方可以寫定義體)。在實踐中,局部類是很少使用的。下面是一個局部類的例子。

  int a;

void fun() 

 { 

static int s; 

class A 

public: 

void init(int i)  { s = i; } 

}; 

A m; 

m.init(10); 

局部類的另一個用途是用來實作類型轉化,如下代碼:

class Interface 

   virtual void Fun() = 0;   

template

Interface* MakeAdapter(const T& obj, const P& arg) 

    int x; 

   class Local : public Interface 

    { 

   public: 

      Local(const T& obj, const P& arg) 

         : obj_(obj), arg_(arg)  {} 

      virtual void Fun() 

       { 

          x = 100; 

         obj_.Call(arg_); 

      } 

   private: 

      T obj_; 

      P arg_; 

   }; 

   return new Local(obj, arg); 

}

C++嵌套類:

在一個類中定義的類稱為C++嵌套類,定義嵌套類的類稱為外圍類。定義嵌套類的目的在于隐藏類名,減少全局的辨別符,進而限制使用者能否使用該類建立對象。這樣可以提高類的抽象能力,并且強調了兩個類(外圍類和嵌套類)之間的主從關系。下面是一個嵌套類的例子:

  class A 

 public: 

class B 

… 

private: 

void f(); 

int a; 

};

對嵌套類的若幹說明:

1、從作用域的角度看,嵌套類被隐藏在外圍類之中,該類名隻能在外圍類中使用。如果在外圍類的作用域内使用該類名時(#add 也就是外圍類的外部),需要加名字限定。

2、從通路權限的角度來看,嵌套類名與它的外圍類的對象成員名具有相同的通路權限規則。不能通路嵌套類的對象中的私有成員函數,也不能對外圍類的私有部分中的嵌套類建立對象。

3、C++嵌套類中的成員函數可以在它的類體外定義。

4、嵌套類中說明的成員不是外圍類中對象的成員,反之亦然。嵌套類的成員函數對外圍類的成員沒有通路權,反之亦然。國此,在分析嵌套類與外圍類的成員通路關系時,往往把嵌套類看作非嵌套類來處理。這樣,上述的嵌套類可寫成如下格式:

 #add 嵌套類可以通路外圍類的static資料,即使為private

由引可見,嵌套類僅僅是文法上的嵌入。

5、在C++嵌套類中說明的友元對外圍類的成員沒有通路權。

6、如果嵌套類比較複雜,可以隻在外圍類中對嵌套類進行說明,關于嵌套的詳細的内容可在外圍類體外的檔案域中進行定義。

繼續閱讀