C++ 中的巢狀類和區域性類
阿新 • • 發佈:2018-12-31
C++ 中的巢狀類和區域性類
最近趁著春節假期空閒,找了本C++ Primer 學了幾章,發現C++ 中的許多特性自己都不知道。其中巢狀類和區域性類感覺還是蠻有用的,簡單的寫寫他們的用法。
巢狀類
所謂巢狀類就是可以在一個類中定義另一個類。這個被巢狀的類的作用域就只在它的上一級類中。下面是個例子:
#include <iostream> using namespace std; class c1 { public: int a; void foo(); class c2 { public: int a; void foo(); } b; }; void c1::foo() { a = 1; } void c1::c2::foo() { a = 2; } int main() { class c1 f; f.foo(); f.b.foo(); cout << f.a << endl; cout << f.b.a << endl; return 0; }
其實在C語言中也有類似的用法,在一個結構體中巢狀另一個結構體,或者在一個結構體中巢狀一個union 。我們還知道,C 語言中被巢狀的結構體或union 通常是匿名的。在C++中也是可以的,我們可以在一個類中巢狀另外一個匿名類。不過,匿名類的成員函式只能在類的宣告中同時定義,因為這個類沒有名稱,我們沒法在外部指代它。
下面就是一個類似的例子:
class c3 { public: int a; void foo() {a = 3;} class { public: int a; void foo() {a = 4;} } b; }; int main() { class c3 ff; ff.foo(); ff.b.foo(); cout << ff.a << endl; cout << ff.b.a << endl; return 0; }
區域性類
所謂區域性類,就是定義在一個函式內部的類,這個類只能在這個函式內部使用。下面是個例子:
int main()
{
class c4
{
public:
int a;
void foo() {a = 4;}
};
class c4 ff;
ff.foo();
cout << ff.a << endl;
return 0;
}
通常,巢狀類和區域性類的所有成員變數我們都會宣告為共有的。因為這兩種類只在很小的範圍內使用,沒有必要通過定義介面來隱藏內部的資訊。所以,可以把 class
另外,多說一句,函式是不能巢狀的。比如下面的例子是無法編譯通過的。
int main()
{
void foo() { cout << "WRONG";};
foo();
}
但是我們可以通過一些變通的方法來模擬出一個區域性函式來。具體來說就是通過過載一個類的operator() 方法來模擬一個函式呼叫,下面給個例子:
int main()
{
struct
{
void operator () ( void )
{
cout << "HELLO" << endl;
}
int operator() (int a, int b)
{
return a + b;
}
} foo;
foo();
cout << foo(1, 2);
}