クラス

  • データメンバとともに,関数もメンバとして一緒に宣言できる.
  • 関数以外にも,型の定義や列挙定数の定義などが行える(これらもクラスのメンバとして扱われる).
  • 特定の関数をフレンド関数として特別な扱いを受ける関数として宣言できる.

非公開部・公開部 - アクセス指定ラベル

非公開部

ブロック開始直後から最初のアクセス指定ラベルの直前(または,クラス定義のブロック終了位置)まで.
これは,クラスのメンバ関数,または,フレンド関数しかアクセスできない.

公開部

publicラベルから,次のアクセス指定子ラベルの直前まで(または,クラス定義のブロック終了位置)まで.
これは,メンバ関数やフレンド関数だけでなく,ほかの関数からも制限なしにアクセスできる.

メンバ関数定義

定義位置
  • クラスの中で直接行う.
    インライン関数として扱われる.
  • クラスの中は宣言だけで,定義はクラス定義の外で行う.
    クラス定義の外でメンバ関数やデータメンバを特定する場合は,::演算子を使う(クラス型名::メンバ名).
    そして,メンバ関数の中ではこの「クラス名::メンバ名」を省くことができる.つまり,そのメンバ関数の内部の定義は,メンバ関数が定義されているクラスのスコープに属しているものとして扱われる.
定義のポイント

一般にクラスの先頭には公開部を設けてそこには宣言だけを書き,クラスの外部で定義を行うようにするのが全体としてよい方法である.

  • 宣言はクラス定義とともにヘッダファイルに,定義はソースファイルの中に書く場合が多くなり,定義の詳細を外部にさらさなくて済むようになる.
  • 定義を書き直しても利用者側の翻訳単位をコンパイルする必要はない.

constメンバ関数

メンバ関数を宣言・定義する際に,データメンバを変更するものかどうかを明示する.
これを指定するとデータメンバを変更できなくなる.

// これは,エラー
class A
{
  int i;
  void cmf() const { i=1; }
};

データメンバであるiを変更しようとしているため,エラーとなる.
このように,非constなメンバ関数は,データメンバを変更する可能性が常にあるため,constなオブジェクトに対して非constなメンバ関数を呼ぶことは禁止されている.
「データメンバを変更しないメンバ関数は,必ず const メンバ関数として定義すること」
また,同じ名前・返戻値・仮引数構成をもつ 非const 版と const 版のメンバ関数は共存できる(オーバーロード).
この場合,constなオブジェクトに対しては,const 版のメンバ関数が呼ばれる.

フレンド関数

  • クラス定義の中にキーワードfriendを先頭につけて関数宣言を行ったもの.
  • ここで定義される関数はそのクラスのメンバ関数にはならず,大域関数となる.
  • フレンド関数の宣言は,公開部で行っても非公開部で行っても何の違いもない.
  • メンバ関数と異なり,メンバ名を直接参照したり,thisポインタを使って特定のオブジェクトを参照することはできない.
  • フレンド関数は最終手段で,できる限り必要のないように設計すべき.

静的データメンバ

  • データメンバをstatic付きで宣言する.
  • 静的データメンバの実体は,それを含むクラスに対してただ一つだけ存在し,そのクラスのオブジェクトから参照できる共有の変数となる.
  • 静的データメンバは,オブジェクトが1個も生成されてなくとも利用できる.

静的メンバ関数

  • メンバ関数をstatic付きで宣言する.
  • 1個もオブジェクトを生成していない状態でも呼び出すことが可能.
  • 静的メンバ関数は,オブジェクトの非静的メンバ関数を利用できない.

コンストラク

  • 明示的な呼び出し
    • 宣言によるオブジェクト生成
      T オブジェクト名( コンストラクタへの実引数 );
    • new を使った動的なオブジェクト生成
      new T( コンストラクタへの実引数 );
  • 無名の一時オブジェクトを動的に生成
    T( コンストラクタへの実引数 );
  • 配列要素の初期化時におけるコンストラクタの呼び出し
T 配列名[要素数] = {
  T( コンストラクタへの実引数1 );
  ...
  T( コンストラクタへの実引数N );
};
  • 暗黙的な呼び出し
    • オブジェクト生成時の自動呼び出し.
      T オブジェクト名;
      T* ポインタ = new T;
      T 配列名[要素数];
      デフォルトコンストラクタが自動的に呼ばれる.

デストラク

  • クラスの型名の先頭に「~」を付けた名前を持つ,仮引数も返戻値もないメンバ関数
  • デストラクタが呼ばれるタイミング
    オブジェクトのライフタイムが終了するときに呼ばれる.
    • 局所変数として宣言されたオブジェクトの場合,制御がその局所変数のスコープを出たときに自動的に呼ばれる.
    • 大域変数として宣言されたオブジェクトの場合,プログラム終了時に自動的に呼ばれる.
    • new で確保したオブジェクトの場合,deleteでオブジェクトが破棄される直前に自動的に呼ばれる.