Aide :: en C++
Je suis en train d'apprendre le C++, et je ne peux jamais dire quand j'ai besoin d'utiliser ::
. Je sais que j'ai besoin d'utiliser std::
en face de cout
et cin
. Est-ce à dire qu'à l'intérieur de la iostream
fichier les développeurs qui l'a créé, il a fait un espace de noms appelé std
et de mettre les fonctions cin
et cout
dans l'espace de noms appelé std
? Lorsque j'ai créé une nouvelle classe qui n'est pas dans le même fichier que main()
pour une raison que je doit ajouter ::
.
Par exemple, si je crée un class
appelé A
, pourquoi dois-je mettre A::
en face d'une fonction que je fais, même si je n'ai pas la mettre dans une namesace? Par exemple void A::printStuff(){}
. Si je créer une fonction dans main
, pourquoi n'ai-je pas mettre main::printStuf{}
?
Je sais que ma question est probablement source de confusion, mais quelqu'un pourrait-il m'aider?
cout
, les fonctions de membre de A
) sont définies dans étendues et vous avez à résoudre la portée (c'est-à, dire au compilateur où chercher) avec ::
.Le préfixe de
::
peut être soit un espace de noms ou d'une classe. Depuis main
est ni (c'est une fonction), main::printStuff
serait incorrect.:: donne une idée de la propriété aussi, lorsqu'une définition est une partie d'une classe ou d'un espace de noms, vous devez utiliser :: pour y accéder... pas exactement, mais qui donne une sensation.
cout
et cin
ne sont pas des fonctions, elles sont des objets.OriginalL'auteur foobar5512 | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
Vous êtes à peu près droit sur
cout
etcin
. Ils sont des objets (pas de fonctions) définie à l'intérieur de lastd
espace de noms. Voici leurs déclarations tel que défini par la norme C++:::
est connu comme le opérateur de résolution de portée. Les nomscout
etcin
sont définies au sein destd
, nous avons donc à qualifier leurs noms avecstd::
.Classes se comportent un peu comme des espaces de noms que les noms déclarés à l'intérieur de la classe appartiennent à la classe. Par exemple:
Le constructeur nommé
foo
est un membre de la classe nomméefoo
. Ils ont le même nom parce que sa le constructeur. La fonctionbar
est également membre defoo
.Parce qu'ils sont membres de
foo
, en se référant à eux de l'extérieur de la classe, nous avons à qualifier leurs noms. Après tout, ils appartiennent à cette classe. Donc, si vous allez à définir le constructeur etbar
en dehors de la classe, vous devez le faire comme ceci:C'est parce qu'ils sont en cours de définition à l'extérieur la classe. Si vous ne l'avais pas mis le
foo::
de qualification sur les noms, vous serait la définition de nouvelles fonctions dans le contexte global, plutôt que comme des membres defoo
. Par exemple, ce qui est complètement différentbar
:Il est permis d'avoir le même nom que la fonction dans le
foo
classe parce que c'est dans un domaine différent. Cettebar
est dans la portée globale, tandis que les autresbar
appartenait à lafoo
classe.OriginalL'auteur Joseph Mansfield
La
::
sont utilisés pour déréférencer étendues.sans rapport avec:
cout et cin ne sont pas des fonctions, mais des instances de flux d'objets.
MODIFIER
fixe comme Keine Lust suggéré
Ne devrait pas être
static const int x = 2;
dansmeh
?OriginalL'auteur scones
La
::
est appelé opérateur de résolution de portée.Peut être utilisée comme ceci:
::
identificateurde nom de classe
::
identificateurespace de noms
::
identificateurVous pouvez lire à ce sujet ici
https://docs.microsoft.com/en-us/cpp/cpp/scope-resolution-operator?view=vs-2017
myNamespace::myClass::myMember
ou::std::cout
.+1 pour contrer inexpliquée downvote
OriginalL'auteur Johnny Mnemonic
regarder, c'est informatif [identificateurs Qualifiés
Qualifiée id-expression est un franc id-expression précédées par un opérateur de résolution de portée :: et, éventuellement, d'une séquence d'énumération, (depuis C++11)de la classe ou de l'espace de noms ou decltype expressions (depuis C++11), séparés par de résolution de portée des opérateurs. Par exemple, l'expression std::string::obnl est une expression qui nomme le membre statique osbl dans la chaîne de classe dans l'espace de noms std. L'expression ::tolower noms de la fonction tolower dans l'espace de noms global. L'expression ::std::cout noms de la variable globale cout dans l'espace de noms std, qui est un des meilleurs au niveau de l'espace de noms. L'expression boost::signals2::connexion des noms du type de connexion déclarés dans l'espace de noms signals2, qui est déclarée dans l'espace de noms boost.
Le modèle de mot clé peut apparaître dans des identifiants nécessaires pour lever l'ambiguïté dépendant de noms de modèle]Un
OriginalL'auteur vincent87
Une utilisation pour le "Unaire Opérateur de Résolution de Portée" ou " Colon Colon de l'Opérateur est au local et au global de sélection de variables de même nom:
Le résultat serait:
D'autres utilisations pourraient être: la Définition d'une fonction à partir de l'extérieur de la classe, pour accéder à une variable statique au sein d'une classe ou d'utiliser l'héritage multiple.
OriginalL'auteur TrevorLee