C++

2017-10-03 4 views
4

静的メソッドを呼び出すには、あなたが以下のクラスがあるとしましょう:C++

struct Foo {   
    static void print(std::string x) { std::cout << x << std::endl; }  
}; 

Foo foo; //Or a pointer... 
foo.print("Hello world"); 

Foo::print("Hello world"); 

ようprintを呼び出すの違いは何ですか?

+0

私は違いは見られません(スタイルを除く)。 – Jarod42

+1

実用的には、そして実行に関しては?全く何もない。読みやすさの点で、コードの読者に何が起こっているかを伝え、保守性を持たせることができますか?違いのロット*。後者で行く、それは本当に何が起こっているのか、読者に伝え、非静的メンバ関数への可能な呼び出しについての混乱はありません。 –

答えて

6

最初のバージョンでは、Fooを構築して破棄しなければならないという点で、明らかな違いがあります。

次に、関数呼び出しが実行されたとき(文字列、印刷などを作成するとき)、両方のバージョンが同じことをする点では明らかな類似点があります。

2つの式の評価があまり明白でない点があります。あなたはfooがコールを必要としない場合であっても、それはまだ表現の一部として評価されます、次を参照してください。

[class.static]/1

クラスXの静的メンバsが適格-IDを使用して参照することができる 式X :: s;静的メンバーを参照するために、クラスメンバーのアクセス 構文を使用する必要はありません。 静的メンバーは、クラスメンバーのアクセス構文を使用して を参照することができます。この場合、オブジェクト の式が評価されます。

あなたの場合は何も意味しません。しかし、特定の状況では、プログラムがまったくコンパイルされないことがあります。 For instance, if foo was instead a reference parameter in a constexpr function

+0

を驚か – Arrrow

+0

@Arrrow - うん、ほとんど。 – StoryTeller

+0

は 'フー::プリント()'上の元を使用する理由があるだろうか?オブジェクトは明らかにprintを呼び出すためだけに作られることはありません。 – Arrrow

6

呼び出しの時点で違いはありません。それは6つのうちの1つであり、他のものは6つです。

Foo::print("Hello world");は、さらにです。idiomatic;この信号が読者のところにあるところでは、printstaticとなる可能性があるという条約が成立しました。そのためには、特定のケースでfoo.print("Hello world");を使用するのは特有であり、したがって混乱します。したがって、特に不要なインスタンスを導入する際のオーバーヘッドがある場合は、この方法を避けてください。foo

複雑なクラス階層の別のメソッド内のprintの特定の上書きに到達するには、スコープ解決演算子を使用する表記法を使用することもできます。したがって、の可能性は上記のの可能性があります。

+2

が、私は少なくともの原則)が(だから、foo.print 'の場合に – StoryTeller

+0

を理解することが慣用:)が書き込みコード他人の価値を過小評価することはありませんだ言及のためだけにこれを投票' 'foo'は、実際にはほとんどを持っていますそれがメンバーであることを除いて、クラスのインスタンスで行うのですか?のように、実際にオブジェクトインスタンスで何もしませんか? –

0

あなたの例には違いはありません。静的変数は、クラスのすべてのインスタンス間の共有です。したがって、スコープ演算子またはメンバー選択を介してアクセスできます。

class A{ 
    public: 
     A(){count++;} 
     ~A(){count--;} 

     static int count; 
}; 

int A::count = 0; 

int main(){ 
    A aObj, bObj, cObj; 

    std::cout << "number of A instances: " << A::count << std::endl; 
    std::cout << "number of A instances: " << aObj.count << std::endl; 

    return 0; 
}