18

最小限の作業例を次に示します。

あ:

class A{
        static int a_member_function();
};

A.cpp

#include "A.h"
int A::a_member_function(){return 5;}


int main(){ return 1;}

このコードはコンパイルおよび実行されますが、次のように思われます。

static int A::a_member_function(){return 5;}

クラス A の静的メンバー関数を定義するためにも同じように簡単に使用できます。実際、この要件があると、.cpp ファイルの読者に a_member_function が静的であることを思い出させるので、実際にはかなり便利なようです。

ただし、これは明らかに機能しません。

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive]

では、なぜうまくいかないのでしょうか。この決定の背後にある理由は何ですか?

4

1 に答える 1

24

その背後にある理由は、キーワードの数を最小限に抑え、C との下位互換性を維持しようとする C++ の精神ですstatic。その位置では、まったく異なる意味を持ちます。

それはすべて C にさかのぼります。C の「静的」関数は、コンパイル単位 (.c ファイル) に固有の関数です。他のコンパイル単位からアクセスすることはできません (C でカプセル化する方法の 1 つです)。この使用法は、C++ でも有効です。グローバル変数に対しても同じことを行って、スコープを制限することができます。

ただし、C++ ではstatic、別の理由でメンバー関数を宣言する必要もあります。これらの関数はクラスに属していますが、そのクラスのインスタンスを実行する必要はありません (すでにご存知のとおり、私は完全になろうとしているだけです)。

メンバー関数を定義するstaticと、矛盾が生じます。その関数は、その翻訳単位の外でアクセスする必要があります。

C と C++ の間でキーワードを再利用する別のケース ( autoC++11 のキーワード) がありますが、問題になる可能性は低くなります。

注:virtual定義ではなく宣言に存在 するキーワードでも同じことが起こります。

于 2012-11-23T14:56:58.390 に答える