C++入門

目次
  1. クラスの継承
  2. フレンド関数
  3. スコープと寿命とリンク
  4. クラスの静的データメンバー
  5. Terminology
  6. 変数、ポインター、参照変数

クラスの継承

派生クラス(derived class)は基底クラス(base class) から
  1. データメンバーとメンバ関数はすべて継承する。
  2. コンストラクタ、コントラクタ、代入演算子は継承されない。
  3. 基底クラスの仮想関数はオーバライドできる。
派生クラスのコンストラクターは、基底クラスの要素の初期化のために基底クラスのコンストラクターを自動的に呼び出す。そのとき、派生クラスのコンストラクタの初期化リストが
  1. ある場合
  2. 無い場合

  3.            基底クラスの引数無しコンンストラクタを呼び出す。
               引数無しコンストラクタがない場合は、エラー。
基底クラスの型を持つポインター変数(pb)に派生クラスへのポインターを代入できる。注意することは、
          delete pb;
を実行したとき、基底クラスのデストラクタが
virtual のときは派生クラスのデストラクタが、
virtual で無いときは、基底クラスのデストラクタが

呼び出されることである。
 

同じ名前のメンバー関数は、シグネチャー(引数の数)が異なっていても、派生クラス型の変数を用いて
基底クラスの関数を呼び出すことはできない。

スコープ解決演算子 :: を用いると、派生クラスから基底クラスの関数を明示的に呼び出すことができる。

呼び出し順序:

コンストラクタ:

  1. 基底クラスのコンストラクタの呼び出し。
  2. 派生クラスのデータメンバーのコンストラクターの呼び出し。
  3. 派生クラスのコンストラクタの呼び出し。
デストラクタ:
  1. 派生クラスのデストラクターの呼び出し。
  2. 派生クラスオブジェクトのデータメンバーのデストラクタの呼び出し
  3. 基底クラスのデストラクターの呼び出し
仮想関数:

仮想関数の呼び出し元と呼び出される関数本体の結合は実行時に行われる。

仮想関数(基底クラスで virtual と指定された関数)が派生クラスで、

  1. 再定義されると、派生クラスの関数が呼び出される。
  2. 再定義されていないと、(派生クラス型の変数からでも)基底クラスの関数が呼び出される。
仮想基底クラス:

多重継承で派生クラスを定義したときに、基底クラスとして複数個同じクラスが含まれていても、1つのオブジェクトしか
生成されないクラス。

派生したクラスには、同じ基底クラスについて仮想基底クラスのインスタンスと非仮想基底クラスのインスタンスを両方持つことができる。(インスタンス=クラスから生成されたオブジェクト)

コンストラクター:

フレンド関数

  クラスメンバーの参照は、通常 private メンバーの場合はそれ自身から、 protected メンバーの場合は
それ自身および派生したクラスからしか参照が許されない。しかし、関数やクラスが friend として定義
 されていると、private や protected メンバーへの参照が許される。例えば、
 
class X;
class Y {
    private:
        int num, denom;
    public:
        friend int X::f(Y a);
        friend class Z;
};
class X {
    public:
        int f(X a);
};
 
int X::f(Y a)
{
    return a.num/a.denom;
}
 
とすると、   X::f(Y a) やクラスZ のすべての関数はクラス Y の private メンバーの参照が可能になる。

スコープと寿命とリンク

  •  局所(local)    ブロックないで宣言された名前
  • 関数(function)       GOTO 文で使われる文ラベル -- 定義された関数内のみで有効

  •  
  • クラス(class)     クラスのメンバー名 -- クラス内で有効

  •  
  • 大域(global)    ブロックやクラスの外で宣言された名前
  • 宣言以後のファイル中のどの関数からでも参照ができる。
    大域変数のリンクは default は外部リンク(external)。static が指定されると内部リンクになる。
    外部リンク:名前が一致すれば他のファイルの変数または関数と同じものとされる。
    内部リンク:変数や関数はそのファイルだけで有効。他のファイルに同じ名前のものがあっても別の変数や関数である見なされる。
    ただし、定数識別子(const)は default で内部リンクである。
     
     
    クラスの静的データーメンバー
    static がつくと、クラスのデータメンバーは静的になる。静的データーメンバーは、個々のオブジェクトには結合せず、クラスに対して一つメンバーが確保されるだけである。生成されたオブジェクトの個数など、クラス全体のデーターを保持するために使用される。静的メンバーはコンパイル時に割り当てられるので、オブジェクトが生成される前に参照することができる(スコープ解決演算子 :: を使って)

    静的データメンバーの初期化にはコンストラクターは使用しない。静的変数と同様に、

    int   MyClass::myvalue=0 ;
    等のようにする。
     
     
     
     

    Terminology
     

  • object

  • an entity that contains some data and an associated set of actions that operate on the data
  • message

  • You send a message to an object to make it perform one of its actions.
  • class

  • defines the implementation of a particular kind of object.
  • instance variables

  • variables defined in a class
  • methods

  • a routine implemented to a class to process message sent to a object.
  • subclass/superclass

  • subclass is can be defined in terms of an existing superclass.
     

    変数、ポインター、参照変数(referene)


    int  x ; 変数--"X という値を示す。
    int *y ; ポインター--"Y" という値を格納しているアドレス。
    int& z ; 参照変数--"アドレスを指す変数。

    例:
    ポインターを使った引数渡し

    void swapi( int *a, int *b)
    {
      int tmp=*a ;
      *a = *b ;
      *b = tmp;
    }
    int x,y;
    swapi( &x, &y );

    参照を使った引数渡し
    void swapir( int& a, int& b)
    {
      int tmp;
      tmp=a;
      a=b;
      b=tmp;
    }

    int x,y;
    swapir( x, y);
     



    (最終更新日:1998年10月15日)