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関数のみが呼び出されます.
四.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で修飾され、ポインタが指す内容や参照の内容が変更されないように保護され、演算子の再ロードにもよく使用されます.結局、関数呼び出し式を左値にできないようにすることです.
転載先:https://www.cnblogs.com/kevinWu7/p/10163449.html
一.修飾一般変数
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