まず、constは通常の型変数を変更します。
cosnt int a=7;
int b=a;//正确
a=8;//错误
const int c;//错误。但是作为函数入参(形参)时,可以这样直接定义,不用初始化。
const変数を変更します。
#include<iostream>
using namespace std;
int main(void)
{
const int a = 7;
int *p = (int*)&a;
*p = 8;
cout<<a;
system("pause");
return 0;
}
const変数aの場合、変数のアドレスを取得して、割り当てをintへのポインターに変換し、* p = 8;を使用して変数aのアドレスに値を再割り当てし、表示aの値を出力します。以下のデバッグウィンドウから、aの値が8に変更されていることがわかりますが、出力は依然として7です。
その理由は、コンパイラが最適化されており、それconst int a = 7;
を回避するためにコンパイラの最適化を変更できるためvolatile const int a = 7;
です。このように、デバッグと出力は8です。
2番目に、const変更されたポインター変数
- constは、ポインターが指すコンテンツを変更し、コンテンツは不変です(定数ポインター、定数ポインター、つまり、指すコンテンツは定数です)。
const int *p=8;//const位于*左边,指向内容不可变
- const修飾子ポインター、ポインターは変数ではありません(ポインター定数、ポインターは定数、つまりアドレスは定数です)
int a=8;
int* const p=&a;
p++;//错误,地址不可变
(*p)++//正确,指向内容可以改变
- constがポインターとポインターが指すコンテンツを変更する場合、ポインターとポイントされるコンテンツはどちらも不変です。
int a=8;
const int * const p=&a;//地址和指向内容都不可变
3、const変更されたパラメーターの転送
- 値転送のconst変更が渡されます。関数は実際のパラメーター値をコピーする一時変数を自動的に生成するため、通常、この場合はconst変更は必要ありません。
#include<iostream>
using namespace std;
void Cpf(const int a){
cout<<a;
// ++a; 是错误的,a 不能被改变
}
int main(){
Cpf(8);
return 0;
}
- constパラメーターがポインターの場合、ポインターが誤って改ざんされるのを防ぐことができます。(ポインター定数と同じ)
#include<iostream>
using namespace std;
void Cpf(int *const a){
cout<<*a<<" ";
*a = 9;
}
int main(){
int a = 8;
Cpf(&a);
cout<<a; // a 为 9
return 0;
}
- カスタム型パラメーターの受け渡し。一時オブジェクトのコピーパラメータが必要です。一時オブジェクトを作成するには、コンストラクタを呼び出す必要がありますが、これは時間の無駄です。したがって、constと参照渡しの方法を採用しています。また、int、doubleなどの一般的な組み込み型の場合、参照転送メソッドは使用しません。
#include<iostream>
using namespace std;
class Test{
public:
Test(){}
Test(int _m):_cm(_m){}
int get_cm()const{
return _cm;
}
private:
int _cm;
};
void Cmf(const Test& _tt){
cout<<_tt.get_cm();
}
int main(){
Test t(8);
Cmf(t);
return 0;
}
4、const変更された関数の戻り値
- constは、組み込み型の戻り値を変更します。変更は、戻り値を変更しないことと同じです。
#include<iostream>
using namespace std;
const int Cmf(){
return 1;
}
int Cpf(){
return 0;
}
int main(){
int _m = Cmf();
int _n = Cpf();
cout<<_m<<" "<<_n;
return 0;
}
-
constはカスタムタイプを戻り値として変更します。現時点では、戻り値を左辺値として使用したり、割り当てたり変更したりすることはできません。
-
constは、返されたポインタまたは参照を変更します。constへのポインタを返すかどうかは、ユーザーが何をしたいかによって異なります。
5番目に、const変更クラスのメンバー関数
const修飾子クラスメンバー関数の目的は、メンバー関数が呼び出されたオブジェクトの値を変更しないようにすることです。呼び出し元オブジェクトの値を変更したくない場合は、すべてのメンバー関数をconstメンバー関数として宣言する必要があります。
注:staticキーワードと一緒にconstキーワードを使用することはできません。staticキーワードは静的メンバー関数を変更するためです。静的メンバー関数にはこのポインターが含まれていないため、インスタンス化できません。constメンバー関数は特定のインスタンスに固有である必要があります。
次のget_cm()const;関数は、constメンバー関数を使用します。
#include<iostream>
using namespace std;
class Test{
public:
Test(){}
Test(int _m):_cm(_m){}
int get_cm()const{
return _cm;
}
private:
int _cm;
};
void Cmf(const Test& _tt){
cout<<_tt.get_cm();
}
int main(){
Test t(8);
Cmf(t);
return 0;
}
get_cm()がconst変更を削除した場合、Cmfによって渡されたconst _ttはオブジェクトの値を変更しません。コンパイラは、関数がオブジェクトの値を変更すると見なします。メンバー関数。
オブジェクトの特定のメンバーを変更したいメンバー関数がある場合はどうなりますか?現時点では、mutableキーワードを使用してこのメンバーを変更できます。mutableの意味も可変で変更が簡単です。mutableキーワードによって変更されたメンバーは、次の例のように、常に変更できます。
#include<iostream>
using namespace std;
class Test{
public:
Test(int _m,int _t):_cm(_m),_ct(_t){}
void Kf()const{
++_cm; // 错误
++_ct; // 正确
}
private:
int _cm;
mutable int _ct;
};
int main(){
Test t(8,7);
return 0;
}
ここでは、Kf()constで_ctの値を++ _ ctで変更しますが、_cmを++ _ cmで変更するとエラーが報告されます。++ _ cmは変更可能ではないためです。