C/C++ベース:constキーワードまとめ

5500 ワード

constは比較的よく使われるキーワードで、ここではその使い方をまとめて、後で復習して整理して使う準備をします.
総じて、constは、変数(基本データ型、ポインタ、参照、オブジェクト)、関数(一般関数、メンバー関数)の2つのクラスを修飾することができる.
修飾変数
基本データ型の修飾
  • は、const int a = 3のような変数の値を変更することを許さず、aの値を変更すると
  • とエラーが発生する.
  • マクロと比較すると、constはタイプチェックの役割を果たすことができる
  • .
  • 省スペース
  • プログラムの効率を向上させる
  • 注意:const修飾変数は、ポインタによって変更できます.
    #include 
    int main()
    {
      volatile const int a = 3;
      int *p = (int *)&a;
      *p = 5;
      printf("%d
    "
    , *p); printf("%d
    "
    , a); return 0; }
    g++でコンパイルする場合は、volatileを追加して修飾する必要があります(このキーワードの役割は、値を取るたびにメモリから取り出すことです).これはC++コンパイラが定数にアドレスを割り当てているが,使用時に直接即時数で置き換えられていることを示している.
    修飾ポインタ
    int a = 1;
    int b = 2;
    
    //     
    const int *p1 = &a;
    *p1 = 3;            //  
    *p1 = &b;           //  
    
    //     
    int const *p2 = &a;
    *p2 = 3;            //  
    *p2 = &b;           //  
    
    //     
    int *const p3 = &a;
    *p3 = 3;            //  
    *p3 = &b;           //  

    第1の表現は、第2の表現と同様に、ポインタp1およびp2によって変数aの値を変更することはできない(ただし、a自身によって自分の値を変更することができる)
    第3の表現は、p3が他の変数を指すことを許さないことを意味する(constp3を修飾し、p3の内容が変更を許さず、p3の値がaのアドレスであると理解される).
    修飾参照
    int a = 1;
    const int &b = a;
    b = 3;  //  
  • 定数参照この方法はC++でよく用いられるが、入力参照は大量の一時オブジェクトの発生を回避することができ、入力オブジェクトの修正を防止するためにconstを加える修飾
  • を行う.
    修飾関数
    修飾一般関数
      int global_a = 3;
      //    
      const int* return_pointer()
      {
          int *a = &global_a;
          return a;
      }
      //   
      const int return_value()
      {
          int a = 3;
          return a;
      }
      int main
      {
        int *p1 = return_pointer();       //  
        const int *p2 = test();           //  
    
        int value1 = return_value();       //  
        const int value2 = return_value(); //  
      }
    
    constキーワードが関数の先頭に置かれると、戻り値が定数であることを表します.
    「ポインタ伝達」方式の関数戻り値にconstを加算すると、関数戻り値の内容は変更されず、const修飾を加算した同型ポインタにのみ付与される.
    しかし、関数の戻り値が値伝達にすぎない場合、関数が変数に返す値は複製された一時的な変数であるため、constを加えて修飾することは意味がない.
    修飾メンバー関数
  • は、constキーワード修飾メンバー関数の戻り値を修飾一般関数と同様に作用させる.ここでは説明を繰り返しません.
  • class Test
    {
      public:
        void func_const() const
        {
            a = 3;  //  ,                 
            test(); //  ,                  
        }
        void test()
        {
          cout << "hello" << endl;
        }
      private:
        int a;
    };
    関数名の末尾にconstを配置するのはメンバー関数特有のやり方で、通常の関数であればだめです.このような目的は、この関数内でデータ・メンバーの変更が許可されず、非常に多くのメンバー関数を呼び出すことができないことです.本質的にはthisポインタをconstと宣言し、クラスAをインスタンス化した後、test()関数を呼び出し、thisポインタを最初のパラメータとして伝えたが、このthisポインタのタイプはconst A *const thisであり、オブジェクト呼び出しメンバー関数の利用はthisポインタである.これは、定数メンバー関数で非常量メンバー関数を呼び出すことができない理由です(*const this*thisに変換できません).例えば、上記のtest()関数は、呼び出し時に入力されるthisポインタのタイプがconst A *であり、func_const()が入力されるthisポインタのタイプがconst A *constであり、func_const()ではtest()関数が呼び出され、const A *constconst A *に変換できないことが明らかであるため、エラーが発生する.
  • は、関数のリロード
      class Test
      {
        public:
          //       
          void func() {};
          void func() const {};
      };
    
  • を開始することができる.