2012-02-08 16 views
-2

C++の静的メソッドの意味は何ですか? 私はJavaと同じことを理解しているので、静的メソッドを呼び出すためにクラスのインスタンスを作成する必要はありません。 私が覚えているように、Cではメソッドを非公開にするために静的宣言を使用しました。 C++でプライベートメソッドを作成するにはどうすればよいですか? のは、私はヘルパー関数で、いくつかの計算を計算したいとしましょう:それはあるかのようになりますのでC++の静的メソッド

class A{ 
    foo(); 
}; 

A::foo(){ 
    int a=doSomCalculations(); 
} 

どのように私はdoSomecalculationsを定義したJavaのようなプライベートヘルパーメソッド?

答えて

0

明示的にと指定していない場合は、デフォルトでprivateになります。だから、あなたのクラスにfoo()publicとしたい場合は、それを述べる必要があります。あなたのC static事にコメントとして

class A{ 
public: 
    foo(); 
private: 
    void doSomCalulations(); 
}; 

A::foo(){ 
    int a=doSomCalculations(); 
} 

は、私は staticはC. Cには何も privateを行い privatepublicの概念を持っていないと言って何も知りません。 Cでは、 structタイプしかありません。これらはすべてデフォルトで publicです。

C++ structすべてのメンバーがあります。デフォルトではpublicです。あなたはstructprivateメンバーをしたい場合は、明示的に述べることがあるので、同じよう:

struct my_struct 
{ 
int some_public_member; 

private: 
int my_private_member; 
}; 

OTOH、internal linkageを意味Cでstaticがあります。おそらく、あなたはこれをこのように言及していたでしょう。

+0

'struct'にあったのはどうですか? ;) – Nim

+0

@Nimは私の答えにいくつかのデータを追加しました –

0

静的int型doSomCalculations(){ ... }

(私はここでそれを確認することはできません)。

+0

このソリューションがダウングレードされた理由を尋ねることはできますか?それはもう少し精巧な誰かのelsesの答えに似ています。 –

+0

私はdownvoteをしませんでしたが、おそらくもっと詳しく説明しなかったのでしょうか? – nabulke

+0

ありがとう、私はかなりstackoverflowに慣れているので、私は将来私の答えにもう少し時間を費やすだろう。 –

1

あなたが言ったように、静的メソッドでは、オブジェクトのインスタンスを持つ必要はありません。 メソッドは、そのオブジェクトのインスタンス間で共有されます。あなたは以下の方法でプライベートメソッドを宣言することができ++ でC:

class YourClass { 
    public: 
    void publicMethod(); 
    private: 
    void privateMethod(); 
}; 
1

あなたはクラスのコンテキスト内でのプライベート "と混同してファイルスコープで「静的」になっています。ちょうどクラスのパブリックセクションではなく、「プライベート」に入れて、プライベートにするクラスのメソッドまたはデータ項目のために

、これは

class Foo 
{ 
    private: 
    int dosomething(); 
    public: 
    Foo(); 
}; 

その後、(doSomethingの)ことができる唯一のFooのメソッド内で呼び出すことができます。静的関数

class Foo { public: static wibble(); } 

は、Javaのsatic関数のようになることで、あなたはFooのインスタンスを持たずにはFoo :: wibble()を呼び出すことができます。

私は、ファイルスコープで静的を使用することは推奨されておらず、代わりに匿名の名前空間を使用することをお勧めします。

static int iamrunninoutofnames() { .... } 

は宣言されているファイルに対してグローバルですが、そのファイルの外部では使用できません。

namespace { int iamrunninoutofnames() { .... } } 

は効果的には似ていますが、慎重に使用すると柔軟性が高くなります。

関連する問題