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

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

Source: https://habr.com/ru/post/J59558/


All Articles