9

重複の可能性:
C++-静的メンバー関数を「const」修飾子で作成できない理由

静的メンバー関数をconstまたはvolatileまたはconstvolatileとして宣言できない理由を知りたいと思いましたか?

#include<iostream>

class Test 
{     
   static void fun() const 
   { // compiler error
       return;
   }
};
4

4 に答える 4

14

thisメンバー関数のcv-modifiersは、非表示パラメーターの修飾に対応します。

static関数にはthisパラメーターがありません。したがって、cv-qualifiersは必要ありません。そのため、関数でそれらを禁止することが決定されました(IMHOは当然、そうでなければ意味がありません)static

ところで、メンバー関数は、純粋()、削除、デフォルトなどにstaticすることもできません。virtual=0&&

于 2012-10-21T12:54:17.227 に答える
11

それが標準が言っていることだからです:

9.4.1静的メンバー関数[class.static.mfct]

2)[注:静的メンバー関数にはthisポインター(9.3.2)がありません。—endnote]staticメンバー関数は。であってはなりませんvirtual。同じ名前と同じパラメータタイプ(13.1)staticの非メンバー関数があってはなりません。静的メンバー関数は、、、、またはで宣言してはなりませ。(強調鉱山)staticconstvolatileconst volatile

この理由は、const(またはvolatileまたはvirtualstaticメソッドが意味をなさないためです(従来の意味では、以下を参照してください)。たとえばconst、オブジェクトのメンバーを変更できないことを意味しますが、静力学の場合、話すオブジェクトはありません。

const static他のメンバーにも適用できると主張することもできますstaticが、このオプションは無意味と見なされていました。

于 2012-10-21T12:56:11.460 に答える
1

静的メンバー関数は、オブジェクト(つまり、クラスインスタンス)に依存しないグローバルで自由な関数です。非静的メンバー関数のCV修飾子は、それらが呼び出されるオブジェクトのタイプを参照します。この概念は、静的メンバー関数には適用されません。

例:

struct Foo
{
    void f();        // Overload #1
    void f() const;  // Overload #2
    static void g();
};

int main()
{
    Foo x;

    x.f();                            // calls overload #1
    static_cast<Foo const &>(x).f();  // calls overload #2

    Foo::g();                         // does not know about any instance!

    x.g();                            // same as Foo::g(); "x" is a red herring
}
于 2012-10-21T13:02:25.313 に答える
1

静的関数を実行するときは「現在のオブジェクト」がないため、静的関数が存在するconstかどうかについて説明することはほとんど意味がありません。

インスタンスを使用して関数を呼び出すことができますがstatic、これは奇妙なC ++の「機能」であることに注意してください(C ++ 03では値の型を取得するのが難しいため、便利な場合があります)。

struct Foo {
    static void f();
};

void bar()
{
    Foo foo_instance;
    foo_instance.f();  // Exactly the same as Foo::f()
}

静的データメンバーを変更せず、他のconst静的関数のみを呼び出すことができる「const静的関数」を記述できるようにしたいとのことです。

ただし、この区別はC++にはありません。

于 2012-10-21T13:11:01.923 に答える