今日は問題が発生しました。私はstatic
メンバー関数が必要ですが、必須でconst
はありませんが、より良いです。しかし、私は自分の努力に成功しませんでした。なぜ、またはどのように言うことができますか?
5 に答える
const
修飾子を非静的メンバー関数に適用すると、this
ポインターに影響します。class の const 修飾されたメンバー関数のC
場合、this
ポインターの型は ですがC const*
、const 修飾されていないメンバー関数の場合、this
ポインターの型はC*
です。
静的メンバー関数にはthis
ポインターがありません (そのような関数は、クラスの特定のインスタンスで呼び出されません)。そのため、静的メンバー関数の const 修飾は意味がありません。
私はあなたの質問に同意しますが、残念ながら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
const
static
static
サンプルコードでは、foo()
作成できる場合const
、その関数でA::s
は変更できません。このルールが標準に追加された場合、言語の副作用は見られません。それどころか、なぜそのようなルールが存在しないのかは面白いです!
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