Gebruik van :: in C++

Ik ben C++ aan het leren en ik weet nooit wanneer ik ::moet gebruiken. Ik weet wel dat ik std::moet gebruiken voor couten cin. Betekent dit dat in het iostream-bestand de ontwikkelaars die het hebben gemaakt een naamruimte hebben gemaakt met de naam stden de functies cinen coutin de naamruimte genaamd std? Toen ik om de een of andere reden een nieuwe klasse maakte die niet in hetzelfde bestand staat als main(), moet ik ::toevoegen.

Als ik bijvoorbeeld een classmaak met de naam A, waarom moet ik dan A::voor een functie plaatsen die Ik maak, ook al heb ik het niet in een naam gezet? Bijvoorbeeld void A::printStuff(){}. Als ik een functie maak in main, waarom hoef ik dan niet main::printStuf{}in te voeren?

Ik weet dat mijn vraag waarschijnlijk verwarrend is, maar kan iemand me helpen?


Antwoord 1, autoriteit 100%

Je hebt vrijwel gelijk over couten cin. Het zijn objecten (geen functies) gedefinieerd in de stdnaamruimte. Hier zijn hun verklaringen zoals gedefinieerd door de C++-standaard:

Koptekst <iostream>samenvatting

#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;
}

::staat bekend als de operator voor bereikresolutie. De namen couten cinworden gedefinieerd binnen std, dus we moeten hun namen kwalificeren met std::.

Klassen gedragen zich een beetje als naamruimten in die zin dat de namen die in de klasse zijn gedeclareerd, tot de klasse behoren. Bijvoorbeeld:

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

De constructor met de naam foois een lidvan de klasse met de naam foo. Ze hebben dezelfde naam omdat het de constructor is. De functie baris ook lid van foo.

Omdat ze lid zijn van foo, moeten we hun namen kwalificeren als we van buiten de klas naar hen verwijzen. Zij behoren immers tot die klasse. Dus als je de constructor en barbuiten de klasse gaat definiëren, moet je het als volgt doen:

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

Dit komt omdat ze buitende klas worden gedefinieerd. Als je de foo::kwalificatie niet op de namen had gezet, zou je een aantal nieuwe functies in de globale scope definiëren, in plaats van als leden van foo. Dit is bijvoorbeeld een heel andere bar:

void bar()
{
  // Implement different bar
}

Het is toegestaan om dezelfde naam te hebben als de functie in de klasse fooomdat deze in een ander bereik valt. Deze barvalt in het globale bereik, terwijl de andere bartot de klasse foobehoorde.


Antwoord 2, autoriteit 30%

De ::Worden gebruikt om scopes te dalen.

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)
}

niet-gerelateerd:
Cout en CIN zijn geen functies, maar instanties van streamobjecten.

bewerken
Fixed AS KEINE LUST SODGESTELD


Antwoord 3, Autoriteit 28%

De ::wordt de operator van de scope-resolutie genoemd.
Kan zo worden gebruikt:

::Identifier
Klasse-naam ::Identifier
NAMEESPACE ::IDENTIFICATIE

je kunt hier over lezen
https://docs.microsoft.com / EN-US / CPP / CPP / Scope-Resolution-operator? Weergave = VS-2017


Antwoord 4, Autoriteit 8%

Eén gebruik voor de ‘Unary Scope Resolution Operator’ of ‘Colon Colon Operator’ is voor lokale en wereldwijde variabele selectie van identieke 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;
    }

De resulterende uitvoer zou zijn:

Dit is lokaal voor de hoofdfunctie: 30

Dit is globaal voor de hoofdfunctie: 20

Andere toepassingen kunnen zijn: het definiëren van een functie van buiten een klasse, om toegang te krijgen tot een statische variabele binnen een klasse of om meervoudige overerving te gebruiken.


Antwoord 5

kijk ernaar is informatief [Qualified identifiers

Een gekwalificeerde id-expressie is een niet-gekwalificeerde id-expressie die wordt voorafgegaan door een scope-resolutie-operator ::, en optioneel een reeks opsommingen, (sinds C++11) klasse- of naamruimtenamen of decltype-expressies (sinds C++ 11) gescheiden door scope resolutie-operators. De expressie std::string::npos is bijvoorbeeld een expressie die het statische lid npos een naam geeft in de klassetekenreeks in naamruimte std. De expressie ::tolower benoemt de functie tolower in de globale naamruimte. De expressie ::std::cout benoemt de globale variabele cout in naamruimte std, wat een naamruimte op het hoogste niveau is. De expressie boost::signals2::connection benoemt het type connectie gedeclareerd in namespace signalen2, dat is gedeclareerd in namespace boost.

De zoekwoordsjabloon kan zo nodig worden weergegeven in gekwalificeerde ID’s om afhankelijke sjabloonnamen ondubbelzinnig te maken]1

Other episodes