メモの前半は初心者向けに設計されています(ニーモニックルールがどこでどの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
それでも...私は休暇に出かけていました...月曜日から火曜日までコメントに答えられないかもしれません。 不注意を考慮しないでください:-)