Domanda

Una domanda relativa a Regolare cast vsstatic_cast vsdynamic_cast:

Cosa cast sintassi è lo stile che preferisci in C++?

  • C-style cast sintassi: (int)foo
  • In stile C++cast sintassi: static_cast<int>(foo)
  • costruttore sintassi: int(foo)

Essi non possono tradurre esattamente le stesse istruzioni (fanno?) ma il loro effetto dovrebbe essere lo stesso (giusto?).

Se sei solo fusione tra il built-in tipi numerici, trovo in stile C++cast sintassi troppo prolisso.Come un ex programmatore Java tendo ad usare il C stile del cast di sintassi, invece, ma il mio locale C++ guru insiste sull'uso del costruttore di sintassi.

Voi cosa ne pensate?

È stato utile?

Soluzione

È meglio la pratica mai utilizzare C-stile lancia, per tre ragioni principali:

  • come già detto, non viene eseguita una verifica qui.Il programmatore semplicemente non è possibile sapere quale dei vari cast che indebolisce la tipizzazione forte
  • i nuovi modelli sono intenzionalmente di grande impatto visivo.Dal momento che getta spesso rivelano una debolezza nel codice, si argomenta che fare calchi visibile nel codice è una buona cosa.
  • questo è particolarmente vero se si sta cercando cast con uno strumento automatico.La ricerca di C-stile calchi in modo affidabile, è quasi impossibile.

Come palm3D notato:

Trovo in stile C++cast sintassi troppo prolisso.

Questo è intenzionale, per i motivi di cui sopra.

Il costruttore di sintassi (nome ufficiale:funzione in stile in ghisa) è semanticamente lo stesso il cast di tipo C e deve essere evitato (tranne per la variabile inizializzazioni in materia di dichiarazione), per le stesse ragioni.È discutibile se questo deve essere vero anche per i tipi di definire personalizzato costruttori, ma in effective C++, Meyers sostiene che, anche in questi casi si dovrebbe astenersi dal loro utilizzo.Per illustrare:

void f(auto_ptr<int> x);

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

Il static_cast qui si chiama in realtà il auto_ptr costruttore.

Altri suggerimenti

Secondo Stroustrup:

Il "nuovo stile getta" sono stati introdotti per dare ai programmatori un caso di stato le loro intenzioni in modo più chiaro e per il compilatore per la cattura di più gli errori.

Quindi, in realtà, è per la sicurezza come extra in fase di compilazione.

A proposito di questo argomento, sto seguendo le raccomandazioni fatte da Scott Meyers (Più Efficace C++, Voce 2 :Preferisco in stile C++getta).

Sono d'accordo che in stile C++ cast sono prolisso, ma è quello che mi piace di loro :essi sono molto facili da individuare, e rendono il codice più facile da leggere (che è più importante di scrittura).

Hanno anche la forza di pensare a che tipo di cast di cui avete bisogno e scegliere quello di destra, riducendo il rischio di errori.Essi potranno anche aiutare a rilevare gli errori in fase di compilazione, invece, in fase di runtime.

Io uso static_cast per due motivi.

  1. E ' chiaramente ciò che sta avvenendo.Io non riesco a leggere oltre che senza rendersi conto che c'è un cast in corso.Con C-stile getta occhio si può passare a destra su di esso, senza pausa.
  2. È facile la ricerca per ogni posto nel mio codice dove sto casting.

Sicuramente in stile C++.Extra digitando aiuterà a impedire la fusione quando non si deve :-)

C-style cast di sintassi, non controllo di errore.In stile C++cast sintassi, fa un po ' il controllo.Quando si utilizza static_cast, anche se non fa il controllo, almeno si sa che si dovrebbe essere attenti qui.

Cast di tipo C è il peggior modo per andare.E ' più difficile da vedere, ungreppable, riunisce diverse azioni che non devono essere fuse, e non può fare tutto quello che C++in stile calchi possono fare.Che davvero dovrebbe essere rimosso C-stile calchi dalla lingua.

Abbiamo attualmente in uso C-stile getta ovunque.Ho chiesto agli altri casting domanda, e ora vedo il vantaggio di utilizzare static_cast invece, se per nessun altro motivo che è "greppable" (mi piace questo termine).Io probabilmente iniziare a utilizzare che.

Non mi piace lo stile C++;somiglia troppo a una chiamata di funzione.

Andare per stile C++ e, peggio, il brutto dettagliato snippet di codice che compone del C++typecast esplicito sarà un ricordo costante di ciò che tutti sappiamo (io.e il casting esplicito è male, il portare alla moneta-ing di imprecazioni).Non andare con stile C++ se si desidera padroneggiare l'arte di tracciare gli errori di runtime.

Il costruttore di sintassi.C++, OO, costruttori esistono, io li uso.Se si sente il bisogno di annotare tali conversione ctor si dovrebbe fare per ogni tipo, non solo quelle predefinite.Forse si utilizza il "esplicito" parole chiave per la conversione ctors ma il client sintassi riproduce esattamente ciò che il costruttore sintassi per il built-in tipi non.Essere greppable, che può essere vero, ma che cosa è una grande sorpresa che la digitazione dei caratteri in più rende la ricerca semplice.Perché il trattamento di questi quelli che come speciale?Se la scrittura di formule matematiche con un sacco di int e unsigned/...e dalla camera matrimoniale/float - grafica - e avete bisogno di scrivere un static_cast ogni tempo, l'aspetto della formula si riempie ed è molto leggibile.Ed è una battaglia in salita, comunque, dato che un sacco di volte la conversione senza nemmeno accorgersi che si sta.Per il downcast puntatori faccio usare il static_cast, naturalmente, non esiste un costruttore di default che avrebbe fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top