トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
C++
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索

___

■ const


___

■ const

定義 定数であることをコンパイラに宣言する。( ANSI C 規格 ) 変数の前に記述する修飾子、その変数が定数であることを宣言する 文字列リテラルは、静的な領域に確保 静的な領域は Read Write, Read Only の領域に分かれる 文字列リテラルの領域に書き込みをすると、 segmentation fault を起こして処理が終了

    // コンストなオブジェクトは初期化の時点のみ値を指定できる。
    const a=6; 

    // コンパイラがエラーを検出してくれる。
    a++;
ポインタの const は宣言する場所で意味がかわる。

    // pが指す内容を変更できないp自体は変更可能
    const char *p="abc"; 
    char const *p="abc"; 

    // p自体の変更は不可pが指す内容を変更可能
    char * const p="abc"; 
___

■ const 記憶クラス

DESC コンパイラに変数の変更をしないことを宣言する。 目的は、オブジェクトを間違って変更しないようにチェックしてもらうこと。 POINT コンパイルの時点でのチェックなので、実行時のコストは0になる。 プログラムの安全性を高めるために積極的に使うといい。 指定したオブジェクトに変更をしないつもりならば const 宣言をする。 これによって不意に変更をしたときにコンパイラが怒ってくれる。
    // path オブジェクトは変更しない意図であることを宣言する。
    writefile( const string &path ) {


      // ERROR
      path = "";
    } 
WARNING const 表明は早期にすること。 他のメソッドに連鎖的に影響をするため。
___

■ mutable(ミュータブル)

DESC const method に対して, 例外的に値の変更を許す宣言のこと。 mutable のついたメンバは const なメソッド内で変更されてもコンパイラは許可してくれる。 使用する側からしてみれば Client から見て, "変更してもわからない値" を変更するために使う object の振る舞いがこの変数に依存しない場合に有効
    class を MultiThread Safe にするために利用( mutex を mutable にする )

    class Camera {

      public:
        // Matrix 値を参照するだけのため, const
        const float *getMatrix() const{
          if ( isDirty ) { 
            data = recalc(); 
            isDirty = false; 
          }
          return data;
        }

      private:
        // 再計算フラグは const メソッド内でも変更を許可してもらう。
        mutable bool isDirty;      // camera の振る舞いに関係なし
    };

___

■ メソッドにconstをつける

メソッドに const をつけるのは、そのメソッドが オブジェクトを変更しないという約束をすることになる。
     inspector
     mutator
    class Stack {
      // オブジェクトの状態をかえるので const ではない。
      int pop();

      // 要素数を教えるだけなので const
      int nrElement() const;
    };
const なポインタ、リファレンスは、変更できないことを約束しているオブジェクトなので inspector のメソッドのみが使える。
    void test( const Stack &stack ) {
      stack.nrElement();

      // コンパイラに約束が違うと怒られる。
      stack.pop();
    };



NINJAIDX 12