詳細はC++const修飾子です。


概要
constはconstantの略語で、不変の意味です。C++の中で内蔵型変数を修飾するために用いられます。ユーザー定義の対象、メンバー関数、戻り値、関数パラメータ。constは私達の不用意な操作を避けるために助けてくれます。
在这里插入图片描述
constを使用して、関連するデータを定数として定義します。constはデータを一定の範囲で共有することができます。また、任意に変更されないことを保証します。
constは以下を含む
  • 通常オブジェクト
  • 常ポインタ
  • 常引用
  •  通常のオブジェクト
    データメンバーが変わらないようにする必要があるオブジェクトを、常にオブジェクトとして宣言することができます。常にオブジェクト中のすべてのメンバーの値を変更することはできません。
    変数の2つのフォーマット:
    
       const    [(    )];
    const       [(    )];
    通常のオブジェクトには初期値が必要です。たとえば、
    
    Time const t1(12, 34, 46);
    const Time t1(12, 34, 46);
    通常のオブジェクトを変更しようとするメンバーの値は何がありますか?
    
    int main() {
    
        const Time t1(10, 10, 10);  //   const Time  
        t1.set_time(2,2,2);  //     t1       ,   
    
        return 0;
    }
    
      :
    C:\Users\Windows\CLionProjects\Project1\main.cpp: In function 'int main()':
    C:\Users\Windows\CLionProjects\Project1\main.cpp:10:22: error: passing 'const Time' as 'this' argument discards qualifiers [-fpermissive]
         t1.set_time(2,2,2);
                          ^
    In file included from C:\Users\Windows\CLionProjects\Project1\main.cpp:2:
    C:\Users\Windows\CLionProjects\Project1\Time.h:12:10: note:   in call to 'void Time::set_time(int, int, int)'
         void set_time(int h, int m=0, int s=0);
              ^~~~~~~~
    mingw32-make.exe[3]: *** [CMakeFiles\Project1.dir\build.make:81: CMakeFiles/Project1.dir/main.cpp.obj] Error 1
    mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94: CMakeFiles/Project1.dir/all] Error 2
    mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101: CMakeFiles/Project1.dir/rule] Error 2
    mingw32-make.exe: *** [Makefile:136: Project1] Error 2
    通常対象メンバー
    常メンバー関数
    通常のオブジェクトのデータメンバーを参照するには、メンバー関数をconst関数、すなわち通常のメンバー関数として宣言する必要があります。通常のメンバー関数はオブジェクト中のデータメンバーにアクセスすることができますが、通常のオブジェクト中のデータメンバーの値を変更することはできません。
    くりを一つあげる:
    Timeクラス:
    
    #ifndef PROJECT1_TIME_H
    #define PROJECT1_TIME_H
    
    class Time {
    private:
        int minute;
        int second;
    public:
        int hour;
        Time();  //       
        Time(int h, int m=0, int s=0);  //       
        void set_time(int h, int m=0, int s=0);
        void show_time() const;  //         
    };
    
    #endif //PROJECT1_TIME_H
    Time.cpp:
    
    #include "Time.h"
    #include <iostream>
    using namespace std;
    
    //       
    Time::Time() : hour(0), minute(0), second(0) {}
    
    //       
    Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}
    
    void Time::set_time(int h, int m, int s) {
        hour = h;
        minute = m;
        second = s;
    }
    
    void Time::show_time() const {
        cout << hour << ":" << minute << ":" << second << endl;
    }
    メール:
    
    #include "Time.h"
    #include <iostream>
    using namespace std;
    
    int main() {
    
        const Time t1(10, 10, 10);  //   const Time  
        t1.show_time();  //        
    
        return 0;
    }
    デバッグ出力:
    10:10:10
    注:constは関数の種類の一部です。宣言関数と定義関数の両方にconstキーワードがあります。
    レギュラーメンバー
    キーワードconstを使って定数データのメンバーを宣言すると、その値が変更できないことが制限されます。
    Timeクラス:
    
    #ifndef PROJECT1_TIME_H
    #define PROJECT1_TIME_H
    
    class Time {
    private:
    
    public:
        const int hour;  //   hour      
        int minute;
        int second;
    
        Time();  //       
        Time(int h, int m=0, int s=0);  //       
        void set_time(int m=0, int s=0);
        void show_time() const;  //         
    };
    
    #endif //PROJECT1_TIME_H
    hourは常データのメンバーなので、構造関数のパラメータ初期化テーブルを通して常データのメンバーを初期化するしかないです。
    
    //       
    Time::Time() : hour(0), minute(0), second(0) {}
    
    //       
    Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}
    私たちは再構築関数で定数データのメンバーを初期化することができません。例えば、
    
    Time::Time(int h){hour=h;}  //   
    メンバー関数で定数データのメンバーの値を変更することはできません。
    
    void Time::setHour(int h){hour=h;}  //   
    データメンバーアクセス制限
    通常のオブジェクトのメンバー関数はconstを追加していません。コンパイルシステムは非constメンバー関数と考えています。
    在这里插入图片描述
    常にオブジェクトを変更する制限
    オブジェクトが通常オブジェクトとして宣言されている場合は、システムによって自動的に呼び出された暗黙的なコンストラクタとコンストラクタを除いて、オブジェクトの非const型のメンバ関数を呼び出すことができません。
    ポイント:
  • 編集システムは、通常のオブジェクトのメンバー関数が呼び出されていることが発見された限り、関数はconstとして宣言されていないので、エラーを報告します。
  • 防止関数は、経常オブジェクト中のデータメンバの値を変更する
  • を防止する。
  • コンパイルシステムは安全でない要素をブロックして、私達の開発者のために多くの心を省きました。
  • 常メンバ関数で常変数を参照する
  •  常針
    ポインタ変数をconst型として宣言します。ポインタ値は常に初期値として維持されています。変更できません。
    オブジェクトを指す通常のポインタの書式:
    
       *const    ;
    Time time1(10, 12, 15), t2;
    Time * const pt = &t1  // pt     
    pt = &t2; //        
    一般的な用途:一つのポインタを一つのオブジェクトに固定的に接続します。定数ポインタを関数としてイメージします。目的は、関数の実行中にポインタ変数の値を変更することができないことです。
    
    void doSomething(Test * const p1){
        p1 -> setX(5);
        p1 -> printxy();
    } 
    変数へのポインタ
    変数へのポインタ変数を定義する一般的な形式は次の通りです。
    
    const    *    /     const *   ;
    変数のポインターだけが変数を指すことができます。
    在这里插入图片描述
    変数へのポインタ変数は、constとして宣言されていない変数を指しますが、このポインタ変数によって変数の値を変更することはできません。
    在这里插入图片描述
    ポイント:
    変数が変数/オブジェクトとして宣言されている場合、私たちは変数を指すポインタでしか彼を指しません。
    オブジェクトを指すポインタ
    オブジェクトを指すポインタ変数を定義する一般的な形式は?
    
    const    *    /    const *   ;
    くりを一つあげる:
    在这里插入图片描述
    オブジェクトが通常のオブジェクトとして宣言されている場合、私たちは通常のオブジェクトを指すポインタでしか彼を指すことができません。非const型変数/オブジェクトを指すポインタで彼を指すことはできません。
    通常のオブジェクトを指すポインタ変数は、constとして宣言されていないオブジェクトを指してもよいが、このポインタによってオブジェクトの値を変更することはできない。例えば、
    在这里插入图片描述
    結び目
    オブジェクトを指すポインタは、最も一般的な言語関数のイメージを保護して、オブジェクトが関数実行中に変更されないようにします。
    関数を呼び出したいときには、オブジェクトの値が変更されないようにするには、フォームを通常のオブジェクトに対するポインタ変数として定義し、オブジェクトのアドレスを実際の参照として使用します。
    在这里插入图片描述
    在这里插入图片描述
    オブジェクトの常に引用
    変数の適用は変数の別名です。変数名と参照名は同じセグメントに単元が保存されていないことを指します。
    関数の参照は、オブジェクトの参照とすることができます。実際の参照値を関数で変更したくない場合は、形の参照として宣言することができます。例えば、
    
    void fun(Time &t); 
    void fun(const Time &);  //    
    私たちはできるだけ関数パラメータとして通常参照を使用すべきです。
  • は、データの安全を保証することができ、データを任意に変更することができないようにする。
  • は、関数を呼び出したときに実参加のCopyを確立する必要がなく、プログラムの実行効率を向上させることができる

  •  締め括りをつける
    在这里插入图片描述
    ここでC++const修饰符に関する文章を紹介します。C++const修饰符に関する内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。