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

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

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

なんかconstにもいろいろ種類があることがわかったので調べてみた・・・
うまい使い方すれば若干安全性があがるかなぁと・・・
需要ないかもしれないけど
静的でないconstメンバ変数の配列を初期化する方法がしりたかったり
static 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");
 
 }
 
 
 void printStaticCount()
 {
 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;
 }
     #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;
    }

#vote((^ω^)ktkr[0],普通[0],。(`ω´#)。なんじゃこりゃああ[0])



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS