嵌套類和局部類在工做中極少使用,且都可在設計上替代,這裏僅作簡要介紹。
1)局部類
局部類就是將類定義在函數中。形如:
int val = 100;
void foo(int val)
{java
struct Bar { }; class Bar::InsideClass//定義InsideClass類 { };
}
2)嵌套類
嵌套類就是將一個類定義在另外一個類中。形如:
class Interface
{
public:
virtual void Fun() = 0;
};
template <class T, class P>
Interface* Person(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()
{
}
private:
T a;
P b;
};
return new Local(obj, arg);
}c++
嵌套類必須聲明在類的內部,可是能夠定義在類的內部或者外部。在外層類以外定義一個嵌套類時,必須之外層類的名字限定嵌套類的名字。
嵌套類的名字只在外圍類可見。
類的私有成員只有類的成員和友元能夠訪問,所以外圍類不能夠訪問嵌套類的私有成員。嵌套類能夠訪問外圍類的成員(經過對象、指針或者引用)。
一個好的嵌套類設計:嵌套類應該設成私有。嵌套類的成員和方法能夠設爲 public 。
嵌套類能夠直接訪問外圍類的靜態成員、類型名( typedef )、枚舉值。
程序員
(內部類與外部類)
1.1 做用域
嵌套類的聲明位置決定了嵌套類的做用域,即它決定了程序的那部分能夠建立嵌套類的對象。ide
若是嵌套類聲明在一個類的私有部分,則只有嵌套類的外部類能夠知道它。上面的類就是這種狀況。函數
若是嵌套類聲明在一個類的保護部分,對於後者是可見的,對於外界是不可見的。派生類知道該嵌套類,而且能夠直接建立這種類型的對象。設計
若是嵌套類聲明在一個類的公有部分,則容許後者,後者的派生類以及外部世界使用。而後在外部使用時,必須加上外部類的外部類做用域限制符,如: 使用NestedClass 時,應該這樣定義 OutClass::NestedClass nestedInstance.指針
嵌套結構和枚舉的做用域於此相同。許多程序員使用公有的枚舉提供客戶使用的類常量。code
下面表格總結了,嵌套類、結構、枚舉的做用域特徵。對象
1.2 訪問權限
在外部類中聲明嵌套類並無賦予外部類任何對嵌套類的訪問權限,也沒有賦予任何嵌套類對於外部類的訪問權限。與通常類的訪問控制相同(私有,公有,保護)。作用域
局部類
類能夠定義在某個函數的內部,這樣的類被稱爲局部類,局部類定義的類型只在定義它的做用域內可見。
局部類不能使用函數做用域中的變量。
局部類已經封裝在函數做用域中,經過信息隱藏進一步封裝就顯得沒什麼必要了。
能夠在局部類的內部再嵌套一個類,此時,嵌套類的定義能夠出如今局部類以外且與局部類相同的做用域中。
(c++不能在函數中定義函數。c++在類中定義的函數也就是成員函數。)這個類以及由它建立的對象,都侷限在該函數做用域中;必須在類內實現全部的成員函數,不能拿到類外。由於函數是不能夠嵌套定義的;若類內含有靜態數據成員,必須在該函數外初始化;類內不可含有靜態函數成員;類中不可以使用包裹它的函數所定義的除靜態外的局部變量。
c++內部類與java內部類的區別就是:
c++的內部類對象沒有外部類對象的指針,不能訪問外部類對象的非靜態成員;java的非靜態內部類對象有外部類對象的指針,能訪問外部類對象的非靜態成員。
1 局部類Demo 示例
int a;
void fun()
{
static int s;
class A
{
public:
void init(int i) { s = i; }
};
A m;
m.init(10);
}
2 局部類的另外一個用途是用來實現類型轉化
class Interface
{
public:
virtual void Fun() = 0;
};
template <class T, class P>
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);
}
.內嵌類
是在類體內定義的又一個類。外面的類叫外圍類。這個類以及由它建立的對象,都侷限在外層類做用域中;
外界可否使用內層類,全在於訪問權限;若能使用,定要之外圍類::內層類格式來用;
是類組合演化的又一種類間關係,即組合或彙集成員不是產生於其它類,而是產生於內層類;內層類的成員函數,能夠在類內實現,也能夠在外層類以外實現;
內層類的成員函數對外圍類的成員沒有訪問權,反之亦然
定義嵌套類的目的在於隱藏類名,減小全局的標識符,從而限制用戶可否使用該類創建對象。這樣能夠提升類的抽象能力,而且強調了兩個類(外圍類和嵌套類)之間的主從關係。
1 下面是一個嵌套類的例子
class A
{
public:
class B
{
public:
…
private:
…
};
void f();
private:
int a;
}
其中,類B是一個嵌套類,類A是外圍類,類B定義在類A的類體內。
2 對嵌套類的若干說明:
一、從做用域的角度看,嵌套類被隱藏在外圍類之中,該類名只能在外圍類中使用。若是在外圍類的做用域內使用該類名時,須要加名字限定。
二、從訪問權限的角度來看,嵌套類名與它的外圍類的對象成員名具備相同的訪問權限規則。不能訪問嵌套類的對象中的私有成員函數,也不能對外圍類的私有部分中的嵌套類創建對象。
三、嵌套類中的成員函數能夠在它的類體外定義。
四、嵌套類中說明的成員不是外圍類中對象的成員,反之亦然。嵌套類的成員函數對外圍類的成員沒有訪問權,反之亦然。國此,在分析嵌套類與外圍類的成員訪問關係時,每每把嵌套類看做非嵌套類來處理。
上述的嵌套類可寫成以下格式:
class A
{
public:
void f();
private:
int a;
};
class B
{
public:
…
private:
…
};
由引可見,嵌套類僅僅是語法上的嵌入。
五、在嵌套類中說明的友元對外圍類的成員沒有訪問權。六、若是嵌套類比較複雜,能夠只在外圍類中對嵌套類進行說明,關於嵌套的詳細的內容可在外圍類體外的文件域中進行定義。