constキーワードは、C ++で最もあいまいなキーワードの1つです。 constを正しく使用すると、コンパイル段階でも多くのチェックを整理でき、デバッガーやコード分析を使用して見つけるのが難しいエラーの多くを回避できます。
メモの前半は初心者向けに設計されています(ニーモニックルールがどこでどのconstが使用されているかを思い出すのに役立つことを願っています)が、おそらく経験豊富なプログラマーはconstによるメソッドのオーバーロードに関する興味深い情報を取得できるでしょう。
定数とデータ
最も単純なケースは定数データです。 いくつかの記録オプションが可能です。
const int i(1);
int const j(1);
int const k = 1;
それらはすべて正しく、同じことを行います-値を変更できない変数を作成します。
const int k = 1;
k = 7; // <-コンパイル段階でエラー!
定数とポインター
constをポインターで使用する場合、修飾子のアクションは、ポインターの値、またはポインターが指すデータに拡張できます。
動作(定数はデータを参照):
const char * a = "a";
a = "b";
同じことも機能します:
char const * a = "a";
a = "b";
しかし、これは機能しません:
char * const a = "a";
a = "b"; // <-は機能しません
割り当て操作がポインターではなくデータを変更する場合:
* a = 'Y';
状況は正反対です。
constが何を指しているのかを覚えやすくするニーモニックルールがあります。 constが左側にある場合、「*」を通る線を引く必要があり、それはデータの値を参照します。 右側の場合、ポインター値へ。
そしてもちろん、constは2回書くことができます:
const char * const s = "data";
定数と引数/関数の結果
関数では、constという単語は通常のデータの記述と同じ規則に従って使用されます。
定数とメソッド(オーバーロード)
しかし、メソッドには微妙な点が1つあります。
まず、これに適用されるように、constメソッドはメソッドに受け入れられます。 構文は次のとおりです。
クラスA {
プライベート:
int x;
公開:
void f(int a)const {
x = a; // <-は機能しません
}
};
さらに、このconstを使用すると、メソッドをオーバーロードできます。 このようにして、定数オブジェクトの最適化されたメソッドバリエーションを作成できます。
私が説明する:
クラスA {
プライベート:
int x;
公開:
A(int a){
x = a;
cout << "A(int)// x =" << x << endl;
}
void f(){
cout << "f()// x =" << x << endl;
}
void f()const {
cout << "f()const // x =" << x << endl;
}
};
int main(){
A a1(1);
a1.f();
const a2(2);
a2.f();
0を返します。
}
結果:
A(int)// x = 1
f()// x = 1
A(int)// x = 2
f()const // x = 2
つまり、定数オブジェクト(x = 2)の場合、対応するメソッドが呼び出されました。
constオブジェクトを使用する場合は、constメソッドを必ず実装する必要があることを追加するだけです。 この場合、非constメソッドを実装しないと、すべての場合にconstメソッドが暗黙的に使用されます。 つまり、可能な限りconstを使用するのが最適です。
写真はここから撮影されます
http://museum.dp.ua/affiliate/hmuseum/idols.htmlそれでも...私は休暇に出かけていました...月曜日から火曜日までコメントに答えられないかもしれません。 不注意を考慮しないでください:-)