it-swarm.com.de

Verwenden von :: in C++

Ich lerne C++ und kann nie sagen, wann ich :: verwenden muss. Ich weiß, dass ich std:: vor cout und cin verwenden muss. Bedeutet dies, dass die Entwickler, die sie erstellt haben, in der iostream-Datei einen Namespace namens std erstellt haben und die Funktionen cin und cout in den Namespace std gestellt haben? Wenn ich eine neue Klasse erstellt habe, die sich aus irgendeinem Grund nicht in derselben Datei befindet wie main(), muss ich :: hinzufügen.

Wenn ich beispielsweise eine class mit dem Namen A erstelle, warum muss ich A:: vor einer von mir erstellten Funktion platzieren, obwohl ich sie nicht in einen Namensraum gestellt habe? Zum Beispiel void A::printStuff(){}. Wenn ich eine Funktion in main erstelle, warum muss ich nicht main::printStuf{} eingeben?

Ich weiß, dass meine Frage wahrscheinlich verwirrend ist, aber könnte mir jemand helfen?

25
foobar5512

Sie haben ziemlich genau recht mit cout und cin. Sie sind Objekte (keine Funktionen), die im Namespace std definiert sind. Hier sind ihre Deklarationen gemäß dem C++ - Standard:

Header <iostream> Übersicht

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;

  extern wistream wcin;
  extern wostream wcout;
  extern wostream wcerr;
  extern wostream wclog;
}

:: ist bekannt als Bereichsauflösungsoperator. Die Namen cout und cin sind in std definiert, daher müssen wir ihre Namen mit std:: qualifizieren.

Klassen verhalten sich ein wenig wie Namespaces, da die in der Klasse deklarierten Namen zur Klasse gehören. Zum Beispiel:

class foo
{
  public:
    foo();
    void bar();
};

Der Konstruktor foo ist ein member der Klasse foo. Sie haben den gleichen Namen, weil es der Konstruktor ist. Die Funktion bar ist auch ein Mitglied von foo.

Da sie Mitglieder von foo sind, müssen wir ihre Namen qualifizieren, wenn sie von außerhalb der Klasse referenziert werden. Immerhin gehören sie zu dieser Klasse. Wenn Sie also den Konstruktor und bar außerhalb der Klasse definieren, müssen Sie dies wie folgt tun:

foo::foo()
{
  // Implement the constructor
}

void foo::bar()
{
  // Implement bar
}

Dies liegt daran, dass sie definiert werden außerhalb der Klasse. Wenn Sie die foo::-Qualifikation nicht in die Namen aufgenommen hätten, würden Sie einige neue Funktionen im globalen Bereich definieren und nicht als Mitglieder von foo. Zum Beispiel ist dies völlig anders bar:

void bar()
{
  // Implement different bar
}

Es darf den gleichen Namen wie die Funktion in der foo-Klasse haben, da sie sich in einem anderen Bereich befindet. Diese bar ist im globalen Gültigkeitsbereich, während die andere bar zur foo-Klasse gehörte.

41

Die :: werden zur Dereferenzierung von Bereichen verwendet.

const int x = 5;

namespace foo {
  const int x = 0;
}

int bar() {
  int x = 1;
  return x;
}

struct Meh {
  static const int x = 2;
}

int main() {
  std::cout << x; // => 5
  {
    int x = 4;
    std::cout << x; // => 4
    std::cout << ::x; // => 5, this one looks for x outside the current scope
  }
  std::cout << Meh::x; // => 2, use the definition of x inside the scope of Meh
  std::cout << foo::x; // => 0, use the definition of x inside foo
  std::cout << bar(); // => 1, use the definition of x inside bar (returned by bar)
}

nicht verbunden: cout und cin sind keine Funktionen, sondern Instanzen von Stream-Objekten.

EDIT festgelegt als Keine Lust vorgeschlagen

14
scones

Der :: wird als Bereichsauflösungsoperator bezeichnet. Kann wie folgt verwendet werden:

::bezeichner
klassenname::bezeichner
namespace::bezeichner

Sie können hier lesen
https://docs.Microsoft.com/de-de/cpp/cpp/scope-resolution-operator?view=vs-2017

10
Johnny Mnemonic

Eine Verwendung für den Operator "Unary Scope Resolution" oder "Colon Colon Operator" ist die lokale und globale Variablenauswahl identischer Namen:

    #include <iostream>
    using namespace std;

    int variable = 20;

    int main()
    {
    float variable = 30;

    cout << "This is local to the main function: " << variable << endl;
    cout << "This is global to the main function: " << ::variable << endl;

    return 0;
    }

Die resultierende Ausgabe wäre:

Dies ist lokal für die Hauptfunktion: 30

Dies ist global für die Hauptfunktion: 20

Andere Anwendungen könnten sein: Definieren einer Funktion außerhalb einer Klasse, Zugriff auf eine statische Variable innerhalb einer Klasse oder Verwendung der Mehrfachvererbung.

2
TrevorLee

schauen Sie sich das an, ist informativ [Qualified Identifiers

Ein qualifizierter ID-Ausdruck ist ein nicht qualifizierter ID-Ausdruck, der von einem Bereichsauflösungsoperator vorangestellt wird, und optional eine Folge von Enumeration, (seit C++ 11) Klassen- oder Namespace-Namen oder Deklarationstypen (seit C++ 11) getrennt nach Umfang Auflösung Operatoren. Der Ausdruck std :: string :: npos ist beispielsweise ein Ausdruck, der den statischen Member npos in der Klassenzeichenfolge im Namespace std benennt. Der Ausdruck :: tolower benennt die Funktion im globalen Namespace. Der Ausdruck :: std :: cout benennt die globale Variable cout im Namespace std, einem Namespace der obersten Ebene. Der Ausdruck boost :: signals2 :: connection bezeichnet den in Namespacesignale2 deklarierten Typ Connection, der im Namespace boost deklariert ist.

Die Schlüsselwortvorlage wird ggf. in qualifizierten Bezeichnern angezeigt, um abhängige Vorlagennamen zu unterscheiden.] 1

0
vincent87