18.6 局部類
可以在函數體內部定義類,這樣的類稱為局部類(local class)。一個局部類定義了一個類型,該類型只在定義它的局部作用域中可見。與嵌套類不同,局部類的成員是嚴格受限的。
局部類的所有成員(包括函數)必須完全定義在類定義體內部。因此,局部類遠不如嵌套類有用。
類似地,不允許局部類聲明static數據成員,沒有辦法定義它們。
1. 局部類不能使用函數作用域中的變量
局部類可以訪問的外圍作用域中的名字是有限的。局部類只能訪問在外圍作用域中定義的類型名、static變量和枚舉成員,不能使用定義該類的函數中的變量。
[cpp] int a;
class TheClass3{
public:
void foo(int c)
{
static int si;
enum Loc{e=1024,f};
class Bar{
public:
Loc locVal;
int barVal;
void fooBar(Loc i=e)
{
barVal=::a;
barVal=si;
barVal=f;
}
};
}
};
int a;
class TheClass3{
public:
void foo(int c)
{
static int si;
enum Loc{e=1024,f};
class Bar{
public:
Loc locVal;
int barVal;
void fooBar(Loc i=e)
{
barVal=::a;
barVal=si;
barVal=f;
}
};
}
};
2. 常規保護規則適用於局部類
外圍函數對局部類的私有成員沒有特殊訪問權,當然,局部類可以將外圍函數設為友元。
實際上,局部類中private成員幾乎是不必要的,通常局部類的所有成員都為public成員。
3. 局部類中的名字查找
4. 嵌套的局部類
可以將一個類嵌套在局部類內部。這種情況下,嵌套類定義可以出現在局部類定義體之外,但是,嵌套類必須在定義局部類的同一作用域中定義。通常,嵌套類的名字必須用外圍類的名字進行限定,並且嵌套類的聲明必須出現在局部類的定義中。
[cpp] class TheClass3{
public:
void foo()
{
class Bar{
class NestedBar;
};
class Bar::NestedBar{
};
}
};
摘自 xufei96的專欄