525 Stimmen

Was bedeutet der vorangestellte doppelte Doppelpunkt "::"?

Ich habe diese Codezeile in einer Klasse gefunden, die ich ändern muss:

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

und ich weiß nicht genau, was der Doppelpunkt vor dem Klassennamen bedeutet. Ohne diesen würde ich lesen: declaration of tmpCo als Zeiger auf ein Objekt der Klasse Configuration ... aber der vorangestellte doppelte Doppelpunkt verwirrt mich.

Ich habe auch gefunden:

typedef ::config::set ConfigSet;

13voto

Mustafa Ekici Punkte 6862

Ein versteckter globaler Name kann mit dem Auflösungsoperator : referenziert werden:
Zum Beispiel;

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

12voto

Steed Punkte 1212

(Diese Antwort ist hauptsächlich für Googler gedacht, da OP sein Problem bereits gelöst hat). Die Bedeutung von prepended :: - scope resulution operator - wurde bereits in anderen Antworten beschrieben, aber ich möchte hinzufügen, warum die Leute ihn verwenden.

Die Bedeutung ist: "Nimm den Namen aus dem globalen Namespace, nicht aus einem anderen". Aber warum muss das explizit geschrieben werden?

Anwendungsfall - Namensraumkonflikt

Wenn Sie den gleichen Namen im globalen und im lokalen/verschachtelten Namensraum haben, wird der lokale Name verwendet. Wenn Sie also den globalen Namen wollen, stellen Sie ihm folgendes vor :: . Dieser Fall wurde in der Antwort von @Wyatt Anderson beschrieben, siehe sein Beispiel.

Anwendungsfall - Hervorhebung der Nicht-Mitglieder-Funktion

Wenn Sie eine Mitgliedsfunktion (eine Methode) schreiben, sehen Aufrufe an andere Mitgliedsfunktionen und Aufrufe an Nicht-Mitgliedsfunktionen (freie Funktionen) gleich aus:

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

Aber es könnte passieren, dass Twist ist eine Schwesterfunktion der Klasse A y Bend ist eine freie Funktion. Das heißt, Twist verwenden und ändern können m_couner y Bend nicht. Wenn Sie also sicherstellen wollen, dass m_counter 0 bleibt, müssen Sie prüfen Twist aber Sie brauchen nicht zu prüfen Bend .

Um dies deutlicher zu machen, kann man also entweder schreiben this->Twist um dem Leser zu zeigen, dass Twist eine Mitgliedsfunktion ist oder schreiben ::Bend um zu zeigen, dass Bend frei ist. Oder beides. Dies ist sehr nützlich, wenn Sie ein Refactoring durchführen oder planen.

7voto

Vladimir Ivanov Punkte 42019

:: ist ein Operator zur Definition des Namensraumes.

Wenn Sie zum Beispiel cout verwenden wollen, ohne zu erwähnen using namespace std; in Ihrem Code schreiben Sie dies:

std::cout << "test";

Wenn kein Namespace erwähnt wird, heißt es, dass die Klasse zum globalen Namespace gehört.

0voto

Vaman Acharya Punkte 149

"::" steht für den Operator zur Auflösung des Bereichs. Funktionen/Methoden, die denselben Namen haben, können in zwei verschiedenen Klassen definiert sein. Um auf die Methoden einer bestimmten Klasse zuzugreifen, wird der Bereichsauflösungsoperator verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X