C++の内部クラス
1804 ワード
1.内部クラスの概念
あるクラスが別のクラスの内部に定義されている場合、この内部クラスを内部クラスと呼びます.この場合、この内部クラスは独立したクラスであり、外部クラスに属していないため、外部クラスのオブジェクトから内部クラスを呼び出すことはできません.外部クラスは、内部クラスに対して優れたアクセス権を持っていません.
すなわち,内部クラスは外部クラスの友元クラスである.注意:内部クラスは、外部クラスのオブジェクトパラメータを使用して外部クラスのすべてのメンバーにアクセスできます.しかし、外部クラスは内部クラスの友元ではありません.
2.内部クラスは、外部クラスのpublic、protected、privateで定義できます.
内部クラスがpublicで定義されている場合は、外部クラス名::内部クラス名で内部クラスのオブジェクトを定義できます.
privateで定義されている場合、外部では内部クラスのオブジェクトを定義できません.これにより、「継承できないクラスを実装する」という問題が発生します.
3.内部クラスは、外部クラスのオブジェクト/クラス名を必要とせずに、外部クラスのstatic、列挙メンバーに直接アクセスできることに注意してください.
ここで
これは友元類の使用と同じ理屈です.「別のクラスのメンバーを使用するには、このクラスのオブジェクトが存在する必要があります」.
これで大丈夫です.
4.スタックに内部クラスオブジェクトを作成するには:
5.内部クラスは、外部クラスで宣言し、外部クラスの外部定義を行うことができます.
この形式はもっと友元類に似ている.ここと友元類に注意して、混同しないでください.
6.sizeof(外部クラス)=外部クラスであり、内部クラスとは何の関係もありません.
まとめてみると、実は内部類と友元類が似ています.ただし、内部クラスはメタクラスよりも少し権限があります.クラス名を付けずに外部クラスのstatic、列挙メンバーにアクセスできます.その他はすべて友元類と同じです.
あるクラスが別のクラスの内部に定義されている場合、この内部クラスを内部クラスと呼びます.この場合、この内部クラスは独立したクラスであり、外部クラスに属していないため、外部クラスのオブジェクトから内部クラスを呼び出すことはできません.外部クラスは、内部クラスに対して優れたアクセス権を持っていません.
すなわち,内部クラスは外部クラスの友元クラスである.注意:内部クラスは、外部クラスのオブジェクトパラメータを使用して外部クラスのすべてのメンバーにアクセスできます.しかし、外部クラスは内部クラスの友元ではありません.
2.内部クラスは、外部クラスのpublic、protected、privateで定義できます.
内部クラスがpublicで定義されている場合は、外部クラス名::内部クラス名で内部クラスのオブジェクトを定義できます.
privateで定義されている場合、外部では内部クラスのオブジェクトを定義できません.これにより、「継承できないクラスを実装する」という問題が発生します.
3.内部クラスは、外部クラスのオブジェクト/クラス名を必要とせずに、外部クラスのstatic、列挙メンバーに直接アクセスできることに注意してください.
class A
{
private: static int k;
int h;
public: class B{
void foo(){
cout<
ここで
これは友元類の使用と同じ理屈です.「別のクラスのメンバーを使用するには、このクラスのオブジェクトが存在する必要があります」.
class A
{
private: static int k;
int h;
public: class B{
void foo(A a){
cout<
これで大丈夫です.
4.スタックに内部クラスオブジェクトを作成するには:
class A
{
public: class B{};
};
int _tmain(int argc, _TCHAR* argv[])
{
A::B*b=new A::B();
return 0;
}
5.内部クラスは、外部クラスで宣言し、外部クラスの外部定義を行うことができます.
class A
{
private: static int i;
public: class B;
};
class A::B{
public:void foo(){cout<
この形式はもっと友元類に似ている.ここと友元類に注意して、混同しないでください.
6.sizeof(外部クラス)=外部クラスであり、内部クラスとは何の関係もありません.
class A
{
public:
class B{int o;};
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<
まとめてみると、実は内部類と友元類が似ています.ただし、内部クラスはメタクラスよりも少し権限があります.クラス名を付けずに外部クラスのstatic、列挙メンバーにアクセスできます.その他はすべて友元類と同じです.