constとは定数を意味する
すなわち一度代入されたら、変更が不可能なこと意味している
これは言い換えたら
コード安全性を向上させることに役立つ

特に関数の引数などに使う場合、その変数がポインタなどだった場合
関数内部で変更があるかどうかがわからない
そこで関数の引数にconstが付いてある場合
その引数は関数内部で変更がないことを示している

constポインタとconstメンバ変数
ポインタ変数に格納するアドレスを定数化するのがconstポインタ普通の変数と概念的には同じ
constメンバ変数に関しては初期化子をつかわないと初期化できない

うまい使い方すればコードの安全性があがるかなぁ・・・
(めんどくさいけどね)
下のコードにconstをまとめてみた

    #include <stdio.h>
   
   class ConstClass
   {
   private:
       const static int count[];    // 要素数書かなくても宣言可能
       const int *num1;            // 値書き換え不能
       int *const num2;            // アドレス書き換え不能
       const int *const num3;        // 値、アドレス書き換えともに不能
   public:
   
       // constメンバ変数は初期化リストでしか初期化できない
       // 初期化のとき渡す引数に同じポインタを入れないように注意!!
       ConstClass(const int *a,int *const b,const int *const c):num1(a),num2(b),num3(c)
       {
       }
       void SetNum()
       {
       }
   
       void printNum1()
       {
           const int b[] = {4,5,6};
           num1 = b; // 書き変わっちゃう
   
           printf("call printNum1\n");
           for(int i = 0;i < 3;++i)
           {
               //num1[0] = 1; // エラー
               printf("%p %d\n",&num1[i],num1[i]);
           }
           printf("\n");
       }
   
       void printNum2()
       {
           const int b[] = {4,5,6};
           //num2 = b; // エラー
   
           printf("call printNum2\n");
           for(int i = 0;i < 3;++i)
           {
               num2[i] = b[i]; // 書き変わっちゃう
               printf("%p %d\n",&num2[i],num2[i]);
           }
           printf("\n");
   
       }
   
       void printNum3()
       {
           const int b[] = {4,5,6};
           //num3 = b; // エラー
   
           printf("call printNum3\n");
           // アドレスも値も変更できない
           for(int i = 0;i < 3;++i)
           {
               //num3[i] = b[i]; // エラー
               printf("%p %d\n",&num3[i],num3[i]);
           }
           printf("\n");
   
       }
   
       // メソッド名constはこのメソッド内でクラスの変数に変更がないことを示している
       void printStaticCount() const
       {
           printf("call printStaticCount\n");
           for(int i = 0;i < 3;++i)
           {
               printf("%p %d\n",&count[i],count[i]);
           }
       }
   
       virtual ~ConstClass(){}
   };
   
   // constな静的変数
   const int ConstClass::count[] = {10,20,30};
   
   
   int main()
   {
       int a[] = {1,2,3};
       int b[] = {1,2,3};
       int c[] = {1,2,3};
   
   
       ConstClass test(a,b,c);
   
       // 初期化のとき渡す引数に同じポインタを入れないように注意!!
       // ConstClass test(a,a,a);
       test.printNum1();
       test.printNum2();
       test.printNum3();
   
       test.printStaticCount();
   
       return 0;
   }
選択肢 投票
(^ω^)ktkr 0  
普通 0  
。(`ω´#)。なんじゃこりゃああ 0  

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-09-16 (木) 00:25:14