C++constの使い方

2388 ワード

C++constでは、コンパイラがこのコンストレイントを強制的に実装する意味コンストレイントを指定でき、プログラマがコンパイラに値が一定に保たれていることを伝えることができます.プログラミングで値が一定に保たれている場合は、コンパイラの助けを得るためにconstを明確に使用する必要があります.
1.const修飾メンバー変数
#include<iostream>
using namespace std;
int main(){
    int a1=3;   ///non-const data
    const int a2=a1;    ///const data

    int * a3 = &a1;   ///non-const data,non-const pointer
    const int * a4 = &a1;   ///const data,non-const pointer
    int * const a5 = &a1;   ///non-const data,const pointer
    int const * const a6 = &a1;   ///const data,const pointer
    const int * const a7 = &a1;   ///const data,const pointer

    return 0;
}

const修飾ポインタ変数の場合:
(1)1つのconstのみであり、constが*の左側にある場合、ポインタが指すデータが定数であることを示し、解参照によってそのデータを修正することはできない.ポインタ自体は変数で、他のメモリユニットを指すことができます.
(2)constが1つしかありません.constが*の右側にある場合は、ポインタ自体が定数であり、他のメモリアドレスを指すことはできません.ポインタが指すデータは、参照解除によって変更できます.
(3)2つのconst,*の左右に1つずつ,ポインタとポインタが指すデータが修正できないことを示す.
2.const修飾関数パラメータ
伝達されたパラメータは関数内では変更できません.上で変数を修飾したときの性質と同じです.
void testModifyConst(const int _x) {
     _x=5;   ///    
}

3.const修飾メンバー関数
(1)const修飾のメンバー関数はメンバー変数を変更できません(mutable修飾の変数を除く)
(2)constメンバー関数は、非constメンバー関数がメンバー変数を変更できるため、非constメンバー関数を呼び出すことはできません.
#include <iostream>
using namespace std;
class Point{
    public :
    Point(int _x):x(_x){}

    void testConstFunction(int _x) const{

        ///  , const     ,           
        x=_x;

        ///  ,const         onst    ,   const             
        modify_x(_x);
    }

    void modify_x(int _x){
        x=_x;
    }

    int x;
};

4.const修飾関数の戻り値
(1)ポインタ伝達
const data,non-const pointerを返す場合、戻り値もconst data,non-const pointerに割り当てる必要があります.ポインタが指すデータは定数なので変更できません.
const int * mallocA(){  ///const data,non-const pointer
    int *a=new int(2);
    return a;
}

int main()
{
    const int *a = mallocA();
    ///int *b = mallocA();  ///    
    return 0;
}

(2)値伝達
関数の戻り値が「値伝達方式」を採用すると、関数は戻り値を外部の一時的なメモリセルにコピーするため、const修飾を加えても価値がありません.したがって,値伝達にはconstを加える意味はあまりない.
したがって、
関数int GetInt(void)をconst int GetInt(void)と書かないでください.関数A GetA(void)をconst A GetA(void)と書かないでください.Aはユーザーがカスタマイズしたデータ型です.
(3)引用伝達
参照によって伝達されるすべてのパラメータには、void Foo(const string&in,string*out)などのconstを加えることが望ましい.