C++ポイント
11035 ワード
1.虚関数、純虚関数
虚関数は,プログラムがベースクラスを指すポインタによって,特定の派生クラスを呼び出すことができるこの関数実装に提供され,多態の実装方式である.
純虚関数の定義方法は次のとおりです.
純粋な虚関数を含むクラスを抽象クラス,virtual f()=0と呼ぶ.
抽象クラスはインスタンス化できません.それはただ1層の方法の記述を抽象化するために用いられ,実現する必要はないので,実例化には何の意味もない.
純虚関数は、ベースクラスで説明された虚関数であり、そのベースクラスには具体的な操作内容が定義されておらず、各派生クラスに実際の必要に応じて自分のバージョンを定義するように要求されている.実際,一般の虚関数メンバーと書くフォーマットの違いは,「=0」を付けたことにある.純粋な虚関数として宣言すると、ベースクラスでは関数の実装部分は与えられません.純粋な虚関数の関数体は派生クラスから与えられる.
2.継承、マルチ継承
マルチ継承の主な問題は、2つの意味の問題に注意することです.複数のパスから継承されたベースクラスの同じデータ・メンバーは、2つの意味を回避するために、ダミー継承として定義する必要があります.
3.C++staticの使い方
a.静的データメンバー
クラス内のデータ・メンバーの宣言にキーワードstaticを追加します.このデータ・メンバーは、クラス内の静的データ・メンバーです.
非静的データ・メンバーの場合、各クラス・オブジェクトには独自のコピーがあります.静的データ・メンバーはクラスのメンバーとして扱われます.このクラスのオブジェクトが何個定義されているかにかかわらず、静的データ・メンバーはプログラム内でコピーが1部しかなく、このタイプのすべてのオブジェクトが共有してアクセスします.すなわち、静的データメンバーは、クラスのすべてのオブジェクトに共通しています.このクラスの複数のオブジェクトでは、静的データ・メンバーにはメモリが1回しか割り当てられず、すべてのオブジェクトが共有されます.したがって、静的データメンバーの値は各オブジェクトに対して同じであり、その値は更新することができる.
静的データ・メンバーは、グローバル・データ領域に格納されます.静的データ・メンバー定義ではスペースを割り当てるため、クラス宣言では定義できません.
静的データ・メンバーの初期化は、一般的なデータ・メンバーの初期化とは異なります.静的データ・メンバーの初期化のフォーマットは、次のとおりです.
<データ型><クラス名>::<静的データメンバー名>=<値>
クラスの静的データ・メンバーには、次の2つのアクセス形式があります.
<クラスオブジェクト名>静的データ・メンバー名>または<クラス・タイプ名>:<静的データ・メンバー名>
b.静的メンバー関数
クラスの特定のオブジェクトではなく、クラスのすべてのサービスを提供する静的メンバー関数.静的メンバー関数は、静的データメンバーと同様にクラスの内部実装であり、クラス定義の一部に属します.通常のメンバー関数には、通常のメンバー関数が常にクラスの特定のオブジェクトに属するため、thisポインタが隠されています.通常、thisはデフォルトです.関数fn()のように実際にはthis->fn()です.しかし、通常の関数と比較すると、静的メンバー関数は任意のオブジェクトに関連付けられていないため、thisポインタはありません.この意味では、クラスオブジェクトに属する非静的データ・メンバーにも非静的メンバー関数にもアクセスできません.残りの静的メンバー関数のみを呼び出すことができます.
虚関数は,プログラムがベースクラスを指すポインタによって,特定の派生クラスを呼び出すことができるこの関数実装に提供され,多態の実装方式である.
純虚関数の定義方法は次のとおりです.
1 class A
2 {
3 public:
4 virtual void f() = 0; // f
5 virtual void g();
6 };
純粋な虚関数を含むクラスを抽象クラス,virtual f()=0と呼ぶ.
抽象クラスはインスタンス化できません.それはただ1層の方法の記述を抽象化するために用いられ,実現する必要はないので,実例化には何の意味もない.
純虚関数は、ベースクラスで説明された虚関数であり、そのベースクラスには具体的な操作内容が定義されておらず、各派生クラスに実際の必要に応じて自分のバージョンを定義するように要求されている.実際,一般の虚関数メンバーと書くフォーマットの違いは,「=0」を付けたことにある.純粋な虚関数として宣言すると、ベースクラスでは関数の実装部分は与えられません.純粋な虚関数の関数体は派生クラスから与えられる.
2.継承、マルチ継承
マルチ継承の主な問題は、2つの意味の問題に注意することです.複数のパスから継承されたベースクラスの同じデータ・メンバーは、2つの意味を回避するために、ダミー継承として定義する必要があります.
1 class Top
2 {
3 public:
4 int a;
5 };
6
7 class Left : virtual public Top
8 {
9 public:
10 int b;
11 };
12
13 class Right : virtual public Top
14 {
15 public:
16 int c;
17 };
18
19 class Bottom : public Left, public Right
20 {
21 public:
22 int d;
23 };
3.C++staticの使い方
a.静的データメンバー
クラス内のデータ・メンバーの宣言にキーワードstaticを追加します.このデータ・メンバーは、クラス内の静的データ・メンバーです.
非静的データ・メンバーの場合、各クラス・オブジェクトには独自のコピーがあります.静的データ・メンバーはクラスのメンバーとして扱われます.このクラスのオブジェクトが何個定義されているかにかかわらず、静的データ・メンバーはプログラム内でコピーが1部しかなく、このタイプのすべてのオブジェクトが共有してアクセスします.すなわち、静的データメンバーは、クラスのすべてのオブジェクトに共通しています.このクラスの複数のオブジェクトでは、静的データ・メンバーにはメモリが1回しか割り当てられず、すべてのオブジェクトが共有されます.したがって、静的データメンバーの値は各オブジェクトに対して同じであり、その値は更新することができる.
静的データ・メンバーは、グローバル・データ領域に格納されます.静的データ・メンバー定義ではスペースを割り当てるため、クラス宣言では定義できません.
1 class Myclass
2 {
3 public:
4 Myclass(int a,int b,int c);
5 void GetSum();
6 private:
7 int a,b,c;
8 static int Sum;//
9 };
10
11 int Myclass::Sum=0;//
静的データ・メンバーの初期化は、一般的なデータ・メンバーの初期化とは異なります.静的データ・メンバーの初期化のフォーマットは、次のとおりです.
<データ型><クラス名>::<静的データメンバー名>=<値>
クラスの静的データ・メンバーには、次の2つのアクセス形式があります.
<クラスオブジェクト名>静的データ・メンバー名>または<クラス・タイプ名>:<静的データ・メンバー名>
b.静的メンバー関数
クラスの特定のオブジェクトではなく、クラスのすべてのサービスを提供する静的メンバー関数.静的メンバー関数は、静的データメンバーと同様にクラスの内部実装であり、クラス定義の一部に属します.通常のメンバー関数には、通常のメンバー関数が常にクラスの特定のオブジェクトに属するため、thisポインタが隠されています.通常、thisはデフォルトです.関数fn()のように実際にはthis->fn()です.しかし、通常の関数と比較すると、静的メンバー関数は任意のオブジェクトに関連付けられていないため、thisポインタはありません.この意味では、クラスオブジェクトに属する非静的データ・メンバーにも非静的メンバー関数にもアクセスできません.残りの静的メンバー関数のみを呼び出すことができます.
1 class Myclass
2 {
3 public:
4 Myclass(int a,int b,int c);
5 static void GetSum();/
6 private:
7 int a,b,c;
8 static int Sum;//
9 };
10 int Myclass::Sum=0;//
11
12 Myclass::Myclass(int a,int b,int c)
13 {
14 this->a=a;
15 this->b=b;
16 this->c=c;
17 Sum+=a+b+c; //
18 }
19
20 void Myclass::GetSum() //
21 {
22 // cout<<a<<endl; // ,a
23 cout<<"Sum="<<Sum<<endl;
24 }
25
26 void main()
27 {
28 Myclass M(1,2,3);
29 M.GetSum();
30 Myclass N(4,5,6);
31 N.GetSum();
32 Myclass::GetSum();
33 }