Point-virgule après la déclaration de la classe des accolades
Dans des classes C++, pourquoi le point-virgule après l'accolade de fermeture? Je fais régulièrement de l'oublier et d'obtenir des erreurs de compilation, et donc perte de temps. Semble un peu superflue pour moi, ce qui est peu probable d'être le cas. Les gens vraiment faire des choses comme:
class MyClass
{
.
.
.
} MyInstance;
Je l'obtenir à partir d'une C compatibilité du point de vue de leurs structures et les énumérations, mais étant donné que les classes ne font pas partie du langage C, je suppose que c'est principalement le garder une cohérence entre la déclaration similaire constructions.
Ce que je cherchais était plus liée à la conception des explications plutôt que d'être en mesure de changer quoi que ce soit, bien qu'un bon code de l'achèvement de l'IDE peut recouvrir ce avant la compilation.
- Cela peut vous aider: cpptalk.net/...
- merci pour le lien. À partir d'un point de vue historique, il est de bon sens, et si le C++ permet à tous les C de grammaire, et des classes C++ sont synonyme de structures, nous nous retrouvons avec le nécessaire point-virgule à la fin de la classe.
- ouais grave question. Je suis bien conscient que j'ai à vivre avec elle, mais je curieux au sujet de la justification de la conception et de la mise en œuvre.
- Ok, mais vous devrait peut-être possible de modifier une question à vous voulais la conception à la justification. Comme il est, il encourage les gens à se poser des questions comme "pourquoi l'accolade"? 🙂 Vous pouvez être intéressé par la lecture de Stroustrup Design & Évolution de C++, bien qu'il couvre plus des choses plus importantes que des points-virgules à la fin des classes.
- juste assez, et il était limite quant à savoir si ou de ne pas wiki il. La question a été posée après avoir quitté un point-virgule dans un régulièrement utilisé en-tête dans une grande construction. Il m'a coûté une demi-heure, d'où la visite de la SORTE. Question édités par votre suggestion.
- Les Classes sont essentiellement les structures, la seule différence est leur niveau par défaut de l'accès (privé vs public). Donc, il n'y a pas de différence à l'égard des points-virgules. Je suppose que c'est pourquoi j'ai été tellement incrédule. 🙂
- Je recommande d'écrire toutes les classes en écrivant d'abord le "squelette": classe nom de la Classe {\n a usage privé:\n public:\n }; et ensuite les remplir dans les détails. Ou, comme vous l'avez dit, l'utilisation d'un IDE qui va le faire pour vous
Vous devez vous connecter pour publier un commentaire.
Le point-virgule après l'accolade fermante dans une déclaration de type est requis par la langue. Il a été ainsi depuis les premières versions de C.
Et oui, les gens ne le font d'ailleurs la déclaration que vous venez de mettre là-haut. Il est utile pour la création d'étendue de types à l'intérieur de méthodes.
Dans ce cas, je pense qu'il est clair que les points-virgules sont nécessaires. Pourquoi il est nécessaire dans le cas plus général de la déclarer dans le fichier d'en-tête, je n'en suis pas sûr. Mon deviner est qu'il est historique et a été fait pour rendre l'écriture le compilateur plus facile.
La lien fournis par @MichaelHaren semble fournir le cause. Le point-virgule (comme d'autres l'ont souligné) est héritée de C. Mais cela n'explique pas pourquoi C utilisé en premier lieu. La discussion inclut ce joyau de l'exemple:
Les anciennes versions de C avait implicite de l'int type de retour d'une fonction à moins de déclaration contraire. Si nous omettons le
;
à la fin de la définition de la structure, nous ne sommes pas seulement la définition d'un nouveau type defred
, mais aussi de déclarer quemain()
renvoie une instance defred
. I. e. le code pourrait être analysée comme ceci:Je suppose que c'est parce que les classes sont des déclarations, même lorsqu'ils ont besoin des accolades pour le regroupement. Et oui, il y a l'historique de l'argument que, depuis en C, vous pourriez faire
vous devriez en C++, être capable de faire une chose pareille, il fait sens pour le
class
déclaration à se comporter de la même manière.C'est court pour
Le point-virgule après les accolades de la déclaration de la classe est effectivement exagéré, mais c'est la façon dont C++ est défini. Le point-virgule après la déclaration de la variable est toujours nécessaire et logique.
Je n'utilise pas de telles déclarations
Mais dans ce cas je peux comprendre pourquoi est le point-virgule là.
Parce que c'est comme
int a;
- déclaration de variable.Probablement pour la consistance que vous pouvez omettre 'Moninstance' point-virgule y reste.
Il est nécessaire après un
struct
pour des raisons de compatibilité, et comment voulez-vous ceci:namespace myNamespace { ... } // inconsistent but valid
?En C/C++ l' ; est un terminateur d'instruction.
Toutes les instructions se terminent par ; pour éviter toute ambiguïté (et pour simplifier l'analyse).
La grammaire est cohérente à cet égard.
Même si une déclaration de classe (ou de n'importe quel bloc pour cette question)
est plusieurs lignes de long et est
délimités par des {}, il est encore tout simplement une déclaration (la { } est la partie de la déclaration)
par conséquent, les besoins d'être dénoncé ; (L' ; est pas un séparateur/délimiteur)
Dans votre exemple
est l'intégralité de la déclaration.
On pourrait définir plusieurs instances de la déclaration de classe dans une seule déclaration
C'est tout à fait compatible avec la déclaration de plusieurs instances d'un type primitif en une seule instruction:
La raison n'est pas souvent voir de tels desclaration de classe et d'instance, est l'instance qui pourrait ?seulement? être une variable globale, et vous n'avez pas vraiment veulent souvent des objets globaux, sauf s'ils sont statiques et/ou de la Plaine Anciennes structures de Données.