Hai praticamente ragione su cout
e cin
. Sono oggetti (non funzioni) definiti all'interno dello spazio dei nomi std
. Ecco le loro dichiarazioni come definito dalla norma C++:
Header <iostream>
sinossi
#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;
}
::
è noto come il portata risoluzione operatore. I nomi cout
e cin
sono definiti all'interno di std
, pertanto è necessario qualificare il proprio nome con std::
.
Le classi si comportano un po 'come gli spazi dei nomi in quanto i nomi dichiarati all'interno della classe appartengono alla classe. Per esempio:
class foo
{
public:
foo();
void bar();
};
Il costruttore di nome foo
è un membro della classe denominata foo
. Hanno lo stesso nome perché è il costruttore. La funzione bar
è anche membro di foo
.
Poiché sono membri di foo
, quando ci si riferisce ad essi al di fuori della classe, dobbiamo qualificare i loro nomi. Dopotutto, appartengono a quella classe.Quindi, se avete intenzione di definire il costruttore e bar
di fuori della classe, è necessario fare in questo modo:
foo::foo()
{
// Implement the constructor
}
void foo::bar()
{
// Implement bar
}
Questo è perché si stanno definendo di fuori classe. Se non avessi inserito la qualifica foo::
sui nomi, dovresti definire alcune nuove funzioni nell'ambito globale, piuttosto che come membri di foo
. Per esempio, questo è completamente diverso bar
:
void bar()
{
// Implement different bar
}
È consentito avere lo stesso nome della funzione nella classe foo
perché è in un ambito diverso. Questo bar
è nell'ambito globale, mentre l'altro bar
apparteneva alla classe foo
.
Una bella domanda, ma un po 'troppo ampia (IMO). Si chiama operatore dell'ambito di risoluzione e il termine di ricerca per l'ulteriore apprendimento è * ambito *. Tutti quei nomi ('cout', funzioni membro di' A') sono definiti in * ambiti * e devi risolvere l'ambito (cioè dire al compilatore dove cercare) con '::'. – GManNickG
Il prefisso a '::' può essere uno spazio dei nomi o una classe. Poiché 'main' non è né (è una funzione),' main :: printStuff' non sarebbe corretto. –
:: dà un'idea di proprietà anche quando una definizione fa parte di una classe o di un namespace, dovresti usare :: per accedervi ... non esattamente quello, ma questo ti dà una sensazione. –