C++用語

宣言

オブジェクト、関数、クラス、テンプレートの名前と型をコンパイラに知らせるが、詳細は別

定義

コンパイラにオブジェクト、関数、クラス、テンプレートの詳細を伝える

デフォルトコンストラクタ

引数なしで呼び出せるコンストラクタ

コピーコンストラクタ

同じ型の別オブジェクトを使って、オブジェクトを初期化する。

オブジェクトの値渡し=コピーコンストラクタの呼び出し!

C++のキャスト

const_cast

オブジェクトやポインタの定数性を取り除く

dynamic_cast

安全なダウンキャスト

reinterpret_cast

よくわからん。関数ポインタのキャストとか?

static_cast

C言語的キャスト

constやconst_castといった機能を活用する目的

  • コンパイラでチェックできる。
  • ソースコードに意図が込めることができる。

#defineを頑張って使わないこと

  • 定数設定はconst宣言で充分というか、const宣言使うほうがいい
    • プリプロセッサ通ると数値とかに書き換わっているから変数名でトレースしにくい
    • クラス変数配列にconst値が使えないときはenumで値指定すればOK
  • マクロはinline関数でやる
    • 関数とほとんど同じイメージで使えるし、ミスが少ない
    • inline関数使うとコード量が増えることには注意

new/delete

何故new/delete使うの?

  • コンストラクタ、構造体のコンストラクタ/デストラクタが動きません。

配列のnew/deleteは要注意

Object array = new Object[100];
delete(array);
上のコードはメモリリーク確定。
new xxx[]はdelete[](xxx)
が1セット!

コンストラクタ注意点

  • ポインタメンバはしっかり初期化すること
  • メモリを動的に割り当てるクラスはコピーコンストラクタと代入演算子を宣言すること
  • 代入よりも初期化
    • constやリファレンスのメンバは代入できない
    • クラスメンバは初期化→代入なので、初期化だけにすれば効率的
  • 初期化は宣言された順番から行われる

デストラクタ注意点

  • ポインタメンバのdeleteを忘れないこと
  • 基底クラスには仮想デストラクタを用意すること
    • 基底クラスポインタを使って派生クラスをdeleteすると動作は不定です

自分で作成したクラスの管理用とかにnew/deleteをオーバーロード

  • new/deleteは1セットで書くこと。標準のnew/deleteは独自の管理領域も含めて扱う
  • 配列で最初に固定数確保した領域でやりくりしたりもあり

コメント

  • 嘘を書くくらいなら書かないこと。書くならちゃんと書くこと
  • どーでもいいことの説明はいらない。初期化すると書いても意味なし。数値の意味を書くのは役に立つかも

不必要な関数宣言は保守者の混乱のもと。用意するなら目的をどこかに書いておくこと


データメンバをpublicで公開しないこと

他クラスから好き勝手いじられるパラメータとかありえない

インターフェース中継してアクセスさせて、アクセスする際の注意点を持たせること

配列データをクラス内で使いまわさないこと。どっかで領域はみ出したりする。

  • インターフェースを中継してアクセスすれば、ガード処理も1つだけで済む

値渡しよりもリファレンス渡ししましょう。

  • 値渡しはコピーです。処理がたくさん走ります。
  • なんでもかんでもリファレンス渡ししようとしても、実体がなければリファレンスもできないからね!
最終更新:2011年04月09日 11:51