クラス
- データメンバとともに,関数もメンバとして一緒に宣言できる.
- 関数以外にも,型の定義や列挙定数の定義などが行える(これらもクラスのメンバとして扱われる).
- 特定の関数をフレンド関数として特別な扱いを受ける関数として宣言できる.
非公開部・公開部 - アクセス指定ラベル
非公開部
ブロック開始直後から最初のアクセス指定ラベルの直前(または,クラス定義のブロック終了位置)まで.
これは,クラスのメンバ関数,または,フレンド関数しかアクセスできない.
公開部
publicラベルから,次のアクセス指定子ラベルの直前まで(または,クラス定義のブロック終了位置)まで.
これは,メンバ関数やフレンド関数だけでなく,ほかの関数からも制限なしにアクセスできる.
メンバ関数定義
定義位置
定義のポイント
一般にクラスの先頭には公開部を設けてそこには宣言だけを書き,クラスの外部で定義を行うようにするのが全体としてよい方法である.
- 宣言はクラス定義とともにヘッダファイルに,定義はソースファイルの中に書く場合が多くなり,定義の詳細を外部にさらさなくて済むようになる.
- 定義を書き直しても利用者側の翻訳単位をコンパイルする必要はない.
constメンバ関数
メンバ関数を宣言・定義する際に,データメンバを変更するものかどうかを明示する.
これを指定するとデータメンバを変更できなくなる.
// これは,エラー class A { int i; void cmf() const { i=1; } };
データメンバであるiを変更しようとしているため,エラーとなる.
このように,非constなメンバ関数は,データメンバを変更する可能性が常にあるため,constなオブジェクトに対して非constなメンバ関数を呼ぶことは禁止されている.
「データメンバを変更しないメンバ関数は,必ず const メンバ関数として定義すること」
また,同じ名前・返戻値・仮引数構成をもつ 非const 版と const 版のメンバ関数は共存できる(オーバーロード).
この場合,constなオブジェクトに対しては,const 版のメンバ関数が呼ばれる.
フレンド関数
静的データメンバ
- データメンバをstatic付きで宣言する.
- 静的データメンバの実体は,それを含むクラスに対してただ一つだけ存在し,そのクラスのオブジェクトから参照できる共有の変数となる.
- 静的データメンバは,オブジェクトが1個も生成されてなくとも利用できる.