constの多くの顔

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



それでも...私は休暇に出かけていました...月曜日から火曜日までコメントに答えられないかもしれません。 不注意を考慮しないでください:-)



All Articles