C++ネストクラスとローカルクラス
2233 ワード
原文住所:https://blog.csdn.net/liyuanbhu/article/details/43897979(ここに注记します:上にもう一つの原文のリンクがあるかもしれませんが、csdn転载の文章のタイプが自动的に加算されているので、ここは习惯を保っています.)
以下は本文です.
ネストされたクラス
ネストされたクラスとは、あるクラスで別のクラスを定義できることです.このネストされたクラスの役割ドメインは、その上位クラスにのみ存在します.次に例を示します.
出力:1,2
実はC言語にも似たような使い方があり、ある構造体に別の構造体をネストしたり、ある構造体にunionをネストしたりします.また,C言語でネストされた構造体やunionは通常匿名であることも知られている.C++でも可能で、あるクラスに別の匿名クラスをネストすることができます.ただし、匿名クラスのメンバー関数は、クラスの宣言で同時に定義するしかありません.このクラスには名前がないため、外部では指定できません.似たような例を次に示します.
出力:3,4
ローカルクラス
局所クラスとは,一つの関数内部に定義されたクラスであり,このクラスはこの関数内部でしか使用できない.次に例を示します.
出力:4
通常、ネストされたクラスとローカルクラスのすべてのメンバー変数は共有として宣言されます.この2種類はわずかな範囲でしか使用されないため,インタフェースを定義することで内部の情報を隠す必要はない.だから、classをstructに変えることができて、publicを書かないことができます.
また、関数はネストできません.たとえば次の例ではコンパイルできません.
しかし,いくつかの融通性のある方法で局所関数をシミュレートすることができる.具体的には、クラスを再ロードするoperator()メソッドによって関数呼び出しをシミュレートします.次に例を示します.
出力:HELLO,3
以下は本文です.
ネストされたクラス
ネストされたクラスとは、あるクラスで別のクラスを定義できることです.このネストされたクラスの役割ドメインは、その上位クラスにのみ存在します.次に例を示します.
#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