C++const修飾の異なるタイプの使い方

2792 ワード

constはconstantの略から取って、本意は不変で、変えにくい意味です
一.修飾一般変数
const int a = 7; int b = a;//正しいa=8;//エラー、値付け不可
 
二.修飾ポインタ
int b = 500;const int* a = &b;                      int const *a = &b;この2つは同じで、constが修飾するのは*aで、*aの値を修正することができなくて、*aは実はbの値が*aに値を与えることができなくて、*a=10は間違いを報告してしかしbに値を与えることができて、その上値を与えると*aも変化して、しかしどうしても*aを読むことしかできなくて、*aに値を与えるint*const a=&b;const修飾はaであり,ポインタ自体,すなわちa(アドレス)は修正できないが,*aは変更可能であり,bは変更可能である.
const int* const a = &b; ポインタ自体と指向するコンテンツは定数です
 
三.クラスのメンバー関数を修飾する場合
なぜクラス内のメンバー関数だけを言うのですか?非メンバー関数はconstで修飾できないため、cppファイルの下で直接関数を書いてconstを持つとエラーが発生します.
クラスでメンバー関数をconstに変更すると、オブジェクトのデータメンバーを変更できず、非const関数を呼び出すことができません.なぜconst以外の関数を呼び出せないのですか?非const関数はデータ・メンバーを変更する可能性があり、constメンバー関数はデータ・メンバーを変更できないため、constメンバー関数内ではconst関数のみが呼び出されます.
class A
{
private:
	int i;
public:
	void setnum(int n) //set      i  ,       const
	{
		i = n;
	}

	int getnum() const //get    i  ,    i    ,    const  。        i    。
	{
		//i = 30;     ,     
                //Func();        ,    constd   ,“           "A::func"          
		return i;
	}
        
        int Func()
        {
            return 0;
        }
};

 
四.const修飾関数パラメータ
1.入力されたパラメータが表す内容が関数内で変化することを防止するが、ポインタと参照にのみ意味がある.
値によって伝達されると,パラメータに伝達されるのは実パラメータのコピーだけであり,関数内で形パラメータが変化しても実パラメータは影響を及ぼさないからである.例えば、void fun(const int i){i=10;}関数内ではiの値を変更することはできませんが、実際の意味はありません.値によって実パラメータを伝達する値はもともと変更されないので、constを追加するかどうかは区がありません.
 
2.const修飾の関数パラメータがポインタである場合、そのポインタが指す内容を関数内で修正できないことを意味し、保護作用を果たす
文字列レプリケーションの関数でソース文字列を変更しないことを保証する場合、文字列のレプリケーションvoid fun(const char*src,char*des)/ソース文字列を変更せずに保護し、srcを変更するとコンパイルエラーになります.{                          strcpy(des,src); } またconstポインタは非constポインタとconstポインタを受信することができ、constポインタではなく非constポインタのみを受信することができる.
 
3.const修飾参照の場合
パラメータのタイプがカスタムタイプ、例えばAがカスタムクラスで、void fun(A a){}の場合、渡されたパラメータaは実パラメータオブジェクトのコピーであり、コンストラクタを呼び出してこのコピーを構築し、関数が終了するとコンストラクタを呼び出してこのコピーを解放します.空間的にも時間的にも無駄になるので関数パラメータがクラスオブジェクトの場合は、リファレンスを推奨します.しかし、参照によって伝達されると、セキュリティ上の危険性もあり、関数パラメータの参照によって実パラメータの内部データメンバーを変更できるため、constで実パラメータを保護します.void fun(A&a){}
 
五.修飾関数の戻り値
戻ってきたポインタや参照もconstで修飾され、ポインタが指す内容や参照の内容が変更されないように保護され、演算子の再ロードにもよく使用されます.結局、関数呼び出し式を左値にできないようにすることです.
class A 
{
private:
	int i;
public:
	A() 
	{ 
		i = 0;
	}
    int & get() 
	{
		return i;
	}

	const int & get_i()
	{
		return i;
	}
};

void main()
{
	A a;
	cout << a.get() << endl; //      0
	a.get() = 1; //    a        1,               。
	cout << a.get() << endl; //         1 ,              i  ,                const,               

	a.get_i() = 1;//      ,   const  ,         
}
 

転載先:https://www.cnblogs.com/kevinWu7/p/10163449.html