Question

Une question relative à l' Régulièrement exprimées vs.static_cast vsdynamic_cast:

Ce fonte de la syntaxe, de style préférez-vous en C++?

  • C-style fonte de la syntaxe: (int)foo
  • C++-style fonte de la syntaxe: static_cast<int>(foo)
  • constructeur de syntaxe: int(foo)

Ils ne peuvent pas traduire exactement les mêmes instructions (le font-ils?) mais leur effet doit être le même (à droite?).

Si vous êtes juste la conversion entre les types numériques intégrés, je trouve que C++-style fonte syntaxe trop verbeux.En tant qu'ancien codeur Java, j'ai tendance à utiliser de style C cast syntaxe, mais mon local C++ gourou insiste sur l'utilisation du constructeur de la syntaxe.

Qu'en pensez-vous?

Était-ce utile?

La solution

C'est les meilleures pratiques jamais utilisation de C-style jette pour trois raisons principales:

  • comme déjà mentionné, aucune vérification n'est effectuée ici.Le programmeur ne peut tout simplement pas savoir qui des différents moulages est utilisée, ce qui affaiblit le typage fort
  • les nouvelles distributions sont intentionnellement visuellement frappant.Depuis jette révèlent souvent d'une faiblesse dans le code, il est fait valoir que faire des moulages visible dans le code est une bonne chose.
  • cela est particulièrement vrai si vous recherchez jette un outil automatisé.Trouver style C jette de manière fiable, est presque impossible.

Comme palm3D noté:

Je trouve C++-style fonte syntaxe trop verbeux.

Cela est intentionnel, pour les raisons indiquées ci-dessus.

Le constructeur de la syntaxe (nom officiel:la fonction de style cast) est sémantiquement le même comme le style C cast et doit être évitée (sauf pour les initialisations de variables sur la déclaration), pour les mêmes raisons.Il est discutable de savoir si cela devrait être vrai même pour les types de définir des constructeurs mais Effective C++, Meyers fait valoir que, même dans ces cas, vous devriez vous abstenir de les utiliser.Pour illustrer:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

L' static_cast ici composez le auto_ptr constructeur.

Autres conseils

Selon Stroustrup:

Le "new-style jette" ont été introduites pour donner aux programmeurs une chance d'état leurs intentions plus clairement et pour le compilateur pour attraper plus d'erreurs.

Alors, vraiment, de ses pour la sécurité supplémentaire au moment de la compilation de la vérification.

À ce sujet, je suis en suivant les recommandations faites par Scott Meyers (Plus Efficace C++, Point 2 :Préférez C++-style jette).

Je suis d'accord que le C++ style de la fonte sont verbeux, mais qu'est ce que j'aime à leur sujet :ils sont très faciles à repérer, et ils rendent le code plus facile à lire (ce qui est plus important qu'à l'écrit).

Ils ont également vous forcer à penser à ce genre de casting dont vous avez besoin, et de choisir celui de droite, en réduisant le risque d'erreurs.Ils seront également vous aider à détecter les erreurs au moment de la compilation plutôt qu'à l'exécution.

J'utilise static_cast pour deux raisons.

  1. Il est explicitement précisé que prend place.Je ne peux pas lire plus que, sans réaliser qu'il ya un casting en cours.Avec C-style jette toi l'oeil peut passer à côté sans pause.
  2. Il est facile de rechercher pour chaque place dans mon code où je suis de la coulée.

Certainement C++-style.La saisie de texte supplémentaire aidera à vous empêcher de moulage lorsque vous ne devriez pas :-)

C-style fonte de la syntaxe, de ne pas faire d'erreur vérifier.C++-style fonte de la syntaxe, de ne certains vérification.Lors de l'utilisation de static_cast, même si elle ne fait pas de vérification, au moins vous savez que vous devriez être prudent ici.

C-style fonte est la pire façon d'aller.Il est plus difficile de voir, ungreppable, regroupe les différentes actions qui ne doivent pas être confondues, et ne peut pas faire tout ce que le C++-style jette pouvez le faire.Ils devraient vraiment avoir enlevé C-style jette de la langue.

Nous utilisons actuellement C-style jette partout.J'ai demandé à l'autre casting question, et je vois maintenant l'avantage de l'utilisation de static_cast au lieu de cela, si pour aucune autre raison que c'est "greppable" (j'aime ce terme).Je vais probablement commencer à utiliser.

Je n'aime pas le style C++;cela ressemble trop à un appel de fonction.

Aller pour le style C++ et, au pire, le laid détaillé des extraits de code qui comprend C++explicite transtypage sera un rappel constant de ce que nous savons tous (j'.e explicite le casting est mauvais-de la conduire à la pièce-ing de jurons).Ne pas aller avec le style C++ si vous voulez maîtriser l'art de suivi des erreurs d'exécution.

Le constructeur de la syntaxe.C++ OO, les constructeurs existent, je les utilise.Si vous ressentez le besoin d'annoter ces conversion ctor vous devriez le faire pour chaque type, pas seulement intégrés dans ceux.Peut-être que vous utilisez le 'explicite' mot-clé pour la conversion ctors mais le client syntaxe imite exactement ce que le ctor syntaxe pour les types intégrés ne.Étant greppable, qui est peut-être vrai, mais quelle surprise que de taper plus de caractères qui rend les recherches faciles.Pourquoi traiter ceux-ci comme de spécial?Si vous êtes l'écriture de formules mathématiques avec beaucoup d'int/unsigned/...et à partir de double/float - graphisme - et vous avez besoin d'écrire un static_cast à chaque fois, le regard de la formule se trouve encombré et est très illisible.Et c'est une bataille difficile, de toute façon, beaucoup de fois vous permettra de convertir sans même vous en rendre compte que vous êtes.Pour passer des pointeurs je n'utilise pas le static_cast que bien sûr, pas de ctor existe par défaut qui permettrait de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top