2

constメンバー関数はconstメンバー関数のみを呼び出しますか?

class Transmitter{
  const static string msg;
  mutable int size;
  public: 
    void xmit() const{
    size = compute();
    cout<<msg;
  }
  private:
   int compute() const{return 5;}
};

 string const Transmitter::msg = "beep";

 int main(){
   Transmitter t;
   t.xmit();
   return EXIT_SUCCESS;
 }

私がcompute()をconstにしないと、コンパイラは文句を言います。これは、constメンバー関数がメンバーを変更することを許可されていないため、constメンバー関数がデータメンバーを「間接的に」変更することを意味するため、非constsへの呼び出しを許可しないためですか?

4

5 に答える 5

5

これは、constメンバー関数がメンバーを変更することを許可されていないため、constメンバー関数がデータメンバーを「間接的に」変更することを意味するため、非constsへの呼び出しを許可しないためですか?

はい。

于 2011-01-06T11:40:50.820 に答える
3

はい:constメンバー関数はクラスのバージョンのみを参照します。つまり、コンパイラはメンバー関数内で非メンバー (データまたは関数) をconst検出しません。constconst

この効果は、メンバーconstのみがアクセスできるクラスのオブジェクト (インスタンス) に伝播します。const

正しく適用constすると、プログラマーはクラスの使用をチェックし、変更してはならないオブジェクトに不要な変更が加えられていないことを確認できます。

于 2011-01-06T11:41:28.707 に答える
1

あなたの主張とあなたの分析は両方とも正しいです。

于 2011-01-06T11:50:11.533 に答える
1

はい。「xmit()」を呼び出すと、その「this」ポインターは const になります。つまり、そこから非 const メソッドを呼び出すことはできません。したがって、「compute()」は const でなければなりません。

于 2011-01-06T11:44:59.187 に答える
1

他の人が言ったように; はい。

たとえば、計算を格納するためにローカル キャッシュを使用する場合など、compute を非 const にしたい特定の理由がある場合でも、const バージョンを宣言することにより、const と宣言されている他の関数から呼び出すことができます。

  private:
       int compute() const{return ( const_cast<Transmitter*>(this)->compute());}
       int compute() {return 5;}
于 2011-01-06T11:49:38.043 に答える