98

今日は問題が発生しました。私はstaticメンバー関数が必要ですが、必須でconstはありませんが、より良いです。しかし、私は自分の努力に成功しませんでした。なぜ、またはどのように言うことができますか?

4

5 に答える 5

158

const修飾子を非静的メンバー関数に適用すると、thisポインターに影響します。class の const 修飾されたメンバー関数のC場合、thisポインターの型は ですがC const*、const 修飾されていないメンバー関数の場合、thisポインターの型はC*です。

静的メンバー関数にはthisポインターがありません (そのような関数は、クラスの特定のインスタンスで呼び出されません)。そのため、静的メンバー関数の const 修飾は意味がありません。

于 2011-08-12T03:46:17.040 に答える
27

私はあなたの質問に同意しますが、残念ながらC++はそのように設計されています。例えば:

class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};

今日の時点で、constはのコンテキストで考慮されますthis。ある意味、狭いです。これをポインタconstを超えて適用することで、より広くすることができます。 つまり、「提案された」は、関数にも適用される可能性があり、メンバーによる変更を制限します。 this
conststaticstatic

サンプルコードでは、foo()作成できる場合const、その関数でA::sは変更できません。このルールが標準に追加された場合、言語の副作用は見られません。それどころか、なぜそのようなルールが存在しないのかは面白いです!

于 2011-08-12T05:08:26.420 に答える
1

C++ が設計どおりに受け入れないのは残念ですが、論理的には、適切に検証されるユース ケースはほとんどありません。

クラスレベルの有効な(静的)関数は、静的データを変更しない可能性があります。クエリデータがconstである必要があるだけかもしれません。多分それは次のようにする必要があります

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
于 2016-06-11T18:32:48.500 に答える