C++ネストクラスとローカルクラス

2233 ワード

原文住所:https://blog.csdn.net/liyuanbhu/article/details/43897979(ここに注记します:上にもう一つの原文のリンクがあるかもしれませんが、csdn転载の文章のタイプが自动的に加算されているので、ここは习惯を保っています.)
以下は本文です.
ネストされたクラス
ネストされたクラスとは、あるクラスで別のクラスを定義できることです.このネストされたクラスの役割ドメインは、その上位クラスにのみ存在します.次に例を示します.
#include 
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;
}

出力:1,2
実は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;
}

出力:3,4
ローカルクラス
局所クラスとは,一つの関数内部に定義されたクラスであり,このクラスはこの関数内部でしか使用できない.次に例を示します.
int main()
{
    class c4
    {
    public:
        int a;
        void foo() {a = 4;}
    };

    class c4 ff;
    ff.foo();
    cout << ff.a << endl;
    return 0;
}

出力:4
通常、ネストされたクラスとローカルクラスのすべてのメンバー変数は共有として宣言されます.この2種類はわずかな範囲でしか使用されないため,インタフェースを定義することで内部の情報を隠す必要はない.だから、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);
}

出力:HELLO,3