web-dev-qa-db-ja.com

先頭に二重コロン "::"が付いている意味は何ですか?

私は変更しなければならないクラスのコードのこの行を見つけました:

::Configuration * tmpCo = m_configurationDB;//pointer to current db

二重コロンがクラス名の前に付いているのが正確には何なのかわかりません。それなしで、私は読むだろう:クラスtmpCo...のオブジェクトへのポインタとしてのConfigurationの宣言。

私も見つけました:

typedef ::config::set ConfigSet;
357
rmbianchi

これにより、現在のネームスペースから開始するのではなく、グローバルネームスペースから解決が行われるようになります。たとえば、Configurationという2つの異なるクラスがある場合は、次のようになります。

class Configuration; // class 1, in global namespace
namespace MyApp
{
    class Configuration; // class 2, different from class 1
    function blah()
    {
        // resolves to MyApp::Configuration, class 2
        Configuration::doStuff(...) 
        // resolves to top-level Configuration, class 1
        ::Configuration::doStuff(...)
    }
}

基本的に、それはあなたがあなたの名前が別の名前空間、この場合はMyApp、の中の新しい定義によって壊されるかもしれないのでグローバルな名前空間まで横断することを可能にします。

427
Wyatt Anderson

::演算子はスコープ解決演算子と呼ばれ、まさにそれを行い、スコープを解決します。そのため、type-nameの前にこれを付けることで、型のグローバル名前空間を調べるようにコンパイラに指示します。

例:

int count = 0;

int main(void) {
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;
}
175
Moo-Juice

::はスコープ解決演算子です。何かの範囲を指定するのに使われます。

たとえば、::だけが、他のすべてのネームスペース以外のグローバルスコープです。

some::thingは、以下のいずれかの方法で解釈できます。

  • somenamespace(グローバルスコープ、または現在のスコープより外側のスコープ)で、thingtype、afunctionobject、またはネストされたネームスペース;
  • someは現在のスコープで使用可能なclassで、thingメンバーオブジェクトfunctionまたはsomeクラスの/ type
  • クラスメンバ関数では、someは現在の型のベース型になります(または現在の型自体) thingはこのクラスのメンバーの1つです。atypefunctionまたはobject

some::thing::badのように、スコープを入れ子にすることもできます。ここで、それぞれの名前は型、オブジェクト、または名前空間です。さらに、最後のbadも関数になる可能性があります。関数はその内部スコープ内で何かを公開することはできないため、他のユーザーはできませんでした。

それで、あなたの例に戻って、::thingはグローバルなスコープの中の何か、すなわち型、関数、オブジェクトあるいは名前空間でありえます。

あなたがそれを使用する方法は、それがグローバルスコープの型であることを示唆しています(ポインタ宣言で使用されています)。

私はこの答えがあなたがスコープ解決を理解するのを助けるのに十分で完全で正解であることを願っています。

35
Klaim

::は、何か(変数、関数、クラス、typedefなど)を名前空間またはクラスにリンクするために使用されます。

::の前に左側がない場合は、グローバル名前空間を使用しているという事実を強調しています。

例えば。:

::doMyGlobalFunction();

14

そのスコープ解決演算子と呼ばれます。隠されたグローバル名は、スコープ解決演算子を使用して参照できます。
例えば;

int x;
void f2()
{
   int x = 1; // hide global x
   ::x = 2; // assign to global x
   x = 2; // assign to local x
   // ...
}
9
Mustafa Ekici

(この答えは、OPが既に彼の問題を解決しているので、ほとんどグーグルのためのものです。)スコープ結果演算子というプレフィックス::の意味は、他の答えでも説明されています。

その意味は「グローバル名前空間から名前を取る、他に何もしない」ということです。しかし、なぜこれを明示的につづる必要があるのでしょうか。

ユースケース - 名前空間の衝突

グローバル名前空間とローカル/ネストされた名前空間に同じ名前がある場合は、ローカルの名前空間が使用されます。グローバルなものが欲しいのであれば、それに::を付けます。この事件は@Wyatt Andersonの答えで説明されています、彼の例を見てください。

ユースケース - 非メンバー関数を強調する

メンバー関数(メソッド)を書くとき、他のメンバー関数への呼び出しと非メンバー(フリー)関数への呼び出しは似ています:

class A {
   void DoSomething() {
      m_counter=0;
      ...
      Twist(data); 
      ...
      Bend(data);
      ...
      if(m_counter>0) exit(0);
   }
   int m_couner;
   ...
}

しかし、TwistがクラスAの姉妹メンバー関数で、Bendがフリー関数であることが起こるかもしれません。つまり、Twistm_counerを使用および変更できますが、Bendは変更できません。 m_counterを0のままにしたい場合は、Twistをチェックする必要がありますが、Bendをチェックする必要はありません。

これをより明確にするために、Twistがメンバ関数であることを読者に示すためにthis->Twistを書くか、Bendが空いていることを示すために::Bendを書くことができます。または両方。あなたがリファクタリングをしているか計画しているとき、これは非常に役に立ちます。

6
Steed

::は名前空間を定義する演算子です。

例えば、あなたのコードの中でusing namespace std;を言及せずにcoutを使いたいのであれば、これを書く:

std::cout << "test";

名前空間が言及されていない場合、そのクラスはグローバル名前空間に属していると言われます。

3
Vladimir Ivanov

"::"はスコープ解決演算子を表します。同じ名前を持つ関数/メソッドは、2つの異なるクラスで定義できます。特定のクラススコープのメソッドにアクセスするには、解決演算子を使用します。

0
Vaman Acharya