『C++プログラミング』ノートの-オブジェクトベースプログラミング

7742 ワード

オブジェクト向け:オペレーティングシステムによってメイン関数が呼び出されるほか、他の関数は相互に呼び出され、個々の関数に向くことができます.プログラム=データ構造+アルゴリズム
オブジェクトベース:クラスベースのプログラム
オブジェクト向け:抽象、カプセル化、継承、マルチステートオブジェクト=データ構造+アルゴリズム=(オブジェクト+オブジェクト+..)+メッセージ
 
クラスでprivateもpublicも指定しないと定義されている場合、デフォルトはprivateです.
protected:クラス外(すなわちクラス体、クラスのオブジェクトはクラス外)にアクセスできませんが、派生クラスメンバー関数にアクセスできます.
 
定義:クラス名、直接定義、合法は現れないが、少ない(クラスの申明と使用は分けられ、1つのプログラムサービスだけでなく、一般的にクラスライブラリに置かれている)
class
{
...
}stu1,stu2;
 
メンバー関数:一般的にpublicとして定義され、クラスの対外インタフェースです.メンバー関数は、クラス内のすべてのメンバー(publicおよびprivate.)にアクセスできます.
クラス定義は、関数定義の前にする必要があります.そうしないと、コンパイルエラーが発生します.
組み込みメンバー関数(組み込み関数):一般的に規模が小さく、呼び出し頻度が高く、プログラムが呼び出すときに関数呼び出しプロセス(戻りアドレスを保持するなどの処理)を実際に実行するのではなく、関数コードをプログラム呼び出しポイントに埋め込み、呼び出しメンバー関数の時間オーバーヘッドを大幅に削減します.inlineで明記します.(クラス内定義メンバー関数はinlineを省略でき、デフォルトは内蔵)
クラス内でinline関数を定義する場合は、クラスと同じソースファイルに配置する必要があります.そうしないと、コンパイルは置換できません(関数コードを関数呼び出しポイントにコピーします)
欠点:クラスのインタフェースとクラスの分離に不利で、情報の隠蔽に不利である.
       
メンバー関数の格納方法:各オブジェクトが占有する記憶領域は、オブジェクトデータのメンバーが占有する記憶領域を変更するだけであり、各オブジェクトはinline関数を含むメンバー関数コードを共通に使用し、thisポインタで区別する(静的データメンバーも共有する)
クラス外ではstu 1などのプライベートメンバーにアクセスできません.num = 1010; (numがprivateと明記されている場合、このレプリケーション文はエラーです)
クラスの宣言と実装(メンバー関数定義)は異なるファイルに配置されます.これにより、メンバー関数は一度コンパイルして、形成されたターゲットファイルを保存し、必要に応じてプログラムターゲットファイルに接続します(ライブラリ関数と似ています).
C++プログラマーはすべての申明を冒頭に書くのに慣れていません.C言語とは違います.
オブジェクトの初期化:
クラスのすべてのメンバーがpublicの場合、オブジェクトを定義するときに初期化できます.(この場合は構造体初期化と同様)
コンストラクション関数で初期化:(ユーザー呼び出しを必要とせず、オブジェクトを作成するときに自動的に実行されます).名前はクラス名と同じで、タイプがなく(void型ではありません)、値は返されません.一般的にpublicで、一度しか実行できません
1つのクラスオブジェクトで別のクラスオブジェクトを初期化
Time t 1=t 2は、t 2の各データメンバ値をt 1の対応するメンバにコピーし、t 1のコンストラクタを呼び出さない
パラメータ付きコンストラクション関数:Box::Box(int h,int w,int len)
   {
......
   }
またはパラメータ初期化テーブル:Box(int h,int w,int len):height(h),width(w),length(len){}//後にセミコロンなし
データ・メンバーが配列である場合は、パラメータ初期化テーブル内で初期化することなく、コンストラクション関数内で値を割り当てる必要があります.
Student(int n,char s, char nam[]):num(n),sex(s){strcpy(name,nam);}
コンストラクション関数のリロード:同じ名前、パラメータの個数、またはタイプが異なる
非パラメトリックコンストラクション関数はデフォルトコンストラクション関数に属し、クラスは1つのみです.
デフォルトパラメータを使用したコンストラクション関数:Box(int h=10,int w=10,int len=10);//類体内申明、デフォルトパラメータ指定
Box::Box(int h,int w,int len)/類体外定義
                   {
           ......
}//この場合、オブジェクトを定義するときに実パラメータが不完全または存在しない場合でも、デフォルト値が使用されます.
一般に、コンストラクション関数のリロードとデフォルトパラメータのあるコンストラクション関数を同時に使用するべきではありません.競合しやすいです.
構造関数:オブジェクトを削除するのではなく、オブジェクトがメモリを消費する前にクリーンアップを実行します.
1、自動ローカルオブジェクト:関数呼び出しが終わると、オブジェクトが解放され、解放される前に自動的に構造関数を実行する
2、staticローカルオブジェクト:関数終了時にオブジェクトは解放されず、main関数終了またはexit終了プログラム呼び出し時にstaticオブジェクト構造関数を呼び出す
3、グローバルオブジェクト:プログラムがその役割ドメインを離れたとき(main関数の終了など)その構造関数を呼び出す
構造関数にはタイプがなく、パラメータがないため、リロードできません.クラスには構造関数が1つしかありません.
≪構造関数の呼び出し順序|Call Analysis Function Order|emdw≫:一般的に、構造関数の呼び出し順序とは逆(スタックに相当)です(同じクラスのストレージ・カテゴリ・オブジェクトの場合、staticまたは自動)
オブジェクト配列:Box a[3]=
{
Box(1,2,3),
Box(4,5,6),
Box(7,8,9),
};
オブジェクトメンバー関数へのポインタ:次の3点を一致させる必要があります:1、関数パラメータタイプとパラメータ個数2、関数戻り値3、属するクラス
void(Time:*p);//C言語に比べてクラス名が多くなった、すなわち3番目の制約
p = &Time::get_time; このときpはpublicメンバー関数get_を指すtimeのエントリアドレスget_timeはパラメータを必要とせず、関数名のみ
Thisポインタ、暗黙呼び出し
オブジェクト呼び出し関数Box 1.volume();               
Box 1に相当する.volume(&volume);
共通データ・オブジェクトの保護:
通常オブジェクト:初期値が必要で、すべてのデータメンバー値はTime const t 1(1,2,3)を変更できません.またはconst Time t 1(1,2,3)を変更できません.
通常オブジェクトは、その通常メンバー関数(システムが自動的に呼び出す暗黙的な構造関数と構造関数を除く)のみを呼び出すことができます.すなわち、通常メンバー関数は、その唯一の対外インタフェースです.
常メンバー関数は、常オブジェクトデータメンバーにのみアクセスでき、変更できません.ただし、データ・メンバーをmutableと明記すると、通常のメンバー関数で変更できます.
一般的なクラスの場合:
通常メンバー関数は、このクラスのデータメンバーのみを参照でき、変更できません.
申明:void get_time()const;//const後、明示と定義の両方にconstを追加し、呼び出すときに追加する必要はありません.
非constメンバー関数はconstデータメンバーにアクセスできますが、通常のオブジェクトは非constメンバー関数を呼び出すことはできません.
オブジェクトの動的作成と解放:
静的に定義されたオブジェクトは、プログラムの実行中にオブジェクトが占める空間が関数が終わるまで解放されません.
動的オブジェクトの作成:必要に応じて作成し、必要に応じていつでも取り消すことで、メモリ使用率を向上
newで作成されたオブジェクトは、一般的にオブジェクト名を使用せず、ポインタでアクセスします.
Box*p=new Box(1,2,3,);メモリ内のオブジェクトのヘッダアドレスを返す
オブジェクトの割当て:クラスのデータ・メンバーに動的に割り当てられたデータを含めることはできません.そうしないと、割当て時に重大な結果が発生します.
理由:あるクラスのオブジェクトaに動的申請のデータがある場合、aを同じクラスのオブジェクトbに直接コピーすると、a中の動的ポインタもbに与えられ、a,b中のポインタは同じメモリを指す.これにより、aまたはbがメモリを解放するも、別の訪問者がクラッシュする.
                        .      ,          ,              。
     :Box Box2(Box1);     Box1   Box2
                 :  (  )    ,       ,     ,
 Box::Box(const Box &b)
 {
 height = b.heigt;   width = b.width;  length = b.len;
 }
 
 
      :            ,           
        ,            ,    (    ) Box::height
 
      ,       :   0
 int Box::heigth = 10;
 
 
 
      :           ,            
              ,  this  ,                  
                           
 
 
 Date     :    friend void display(Date &);
  friend void Time::display(Date &);
   :                              ,     
           ,             ,           (        )
 
 
 template <class numtype>   //numtype      ,         
          (     )