1. 程式人生 > >C++ 中的巢狀類和區域性類

C++ 中的巢狀類和區域性類

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 。我們還知道,語言中被巢狀的結構體或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 

改換成 struct,這樣就可以不寫public 了。

另外,多說一句,函式是不能巢狀的。比如下面的例子是無法編譯通過的。

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);
}