今日、私は問題を抱えました。私はstatic
メンバー関数をconst
必要としています。必須ではありませんが、より優れています。しかし、私は自分の努力に成功しませんでした。誰かが理由や方法を言うことができますか?
今日、私は問題を抱えました。私はstatic
メンバー関数をconst
必要としています。必須ではありませんが、より優れています。しかし、私は自分の努力に成功しませんでした。誰かが理由や方法を言うことができますか?
回答:
const
修飾子を非静的メンバー関数に適用すると、this
ポインターに影響します。クラスのconst修飾メンバー関数のC
場合、this
ポインターはタイプC const*
ですが、const修飾されていないメンバー関数の場合、this
ポインターはタイプC*
です。
静的メンバー関数にはthis
ポインターがないため(このような関数はクラスの特定のインスタンスで呼び出されません)、静的メンバー関数のconst修飾は意味がありません。
const
静的メンバーと非静的メンバーの意味は同じでなければならないと想定しています。その考え方が成り立たない例として、static
文脈に依存するの意味を考えてみましょう。
C const*
かconst C*
?
私はあなたの質問に同意しますが、残念ながら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
は変更できません。このルールが標準に追加された場合、言語の副作用は見られません。それどころか、なぜそのようなルールが存在しないのかは面白いです!
const
オブジェクトに適用されます(constメンバー関数の場合、それが呼び出されるインスタンス)。クラスのすべての静的メンバーに適用したいのですが、委員会で検討されたとしても、サポートするのに十分な一般的な要件ではないと思われます。
const
修飾子は、メンバメソッドまたはメンバー変数が、暗黙的に適用されていないthis
-pointer。静的メンバーメソッドはオブジェクトにバインドされていないため、this
作成するポインターはありませんconst
。
詳細に立ち入ることなく、関数によって変更されたオブジェクトがある場合とない場合があるため、constはコンパイラーにとってあいまいです。
const
オブジェクトを一定に保つことを思い出してください。ただし、一定に保つためのオブジェクトがここにある場合とない場合があります。
this
。(それに加えて、const
オブジェクトを一定に保ちません。特定のポインターまたは参照を使用してオブジェクトを変更することはできませんが、変更は別のパスを介して行われる可能性があります)
C ++が設計どおりにそれを受け入れないのは残念ですが、論理的には、それが適切に検証されるユースケースはほとんどありません。
クラスレベルvalid(static)である関数は、静的データを変更しない可能性があります。クエリデータはconstである必要があります。たぶんそれは
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
'constメンバー関数'は、呼び出されたオブジェクトを変更することはできませんが、静的メンバー関数はどのオブジェクトでも呼び出されません。スコープ解決演算子によって直接使用されます。したがって、const静的メンバー関数を持つことは意味がないため、違法です。
const
静的メンバー関数はどういう意味ですか?