2016-05-03 55 views
1

クラスのメンバーには、ドット(.)を使用して特定のオブジェクトのメンバー関数を直接参照する2種類の呼び出しがあります。もう1つの方法は、ダブルコロンを使用することです。 Obj::function()クラス・メンバのスレッドに対して二重コロン・アクセス(::)が有効ですか?

私の質問は、メンバーへのダブルコロンコールはスレッドセーフな操作ですか?

+4

スレッドセーフについては、 '::'は一般的に_anything_とは​​言いません。おそらく、あなたが使用しようとしている図書館の著者に、その図書館の文書を読んだり、読んだりする必要があります。 –

+10

ダブルコロン '::'は*スコープ*演算子です。スコープを表す演算子で、それ以外のものはありません。 –

+0

ダブルコロンは実行時に存在しません...コンパイル時に*を呼び出す正しいメソッドを選択するためにコンパイラによってのみ使用されます。 – Bakuriu

答えて

2

メンバーへのダブルコロンコールはスレッドセーフな操作ですか?

呼び出される関数がスレッドセーフである場合、スレッドセーフです。たとえば:

class C 
{ 
    static std::string mx; 

public: 
    static std::string fx(const char* x) { mx = x; return mx; } // NOT THREAD SAFE 
    static std::string fy(const char* y) { return y; } // THREAD SAFE 
}; 

次のいずれかの関数を呼び出すことができます。

cout << C::fx("hello") << endl; // NOT THREAD SAFE 
cout << C::fy("world") << endl; // THREAD SAFE 

だから、メソッドの実装を行うには、2つのコロンとは何の関係もあり、すべてのものを持っていません。

0

::は、ランタイムについて気にする必要はありません。だから、それはスレッドが動作に入っているときにすべてが解決されているので、スレッドセーフです。

::はちょうどあいまいな名前があるかもしれない場合にに参照される名前空間やクラススコープを明確にするために使用されます。

関連する問題