2015-01-30 21 views
17

Ich studiere C++ um zwei Monate mit dem Buch: Programmierungsprinzipien und Praxis mit C++, und jetzt wollte ich einige Zweifel über mein Casting klären. Wenn ich eine implizite Konvertierung bin Durchführung, zum Beispiel:Typ-Casting in C++

char c = 'a'; 
int b = c; 

Hier ist der Wert von c wird implizit Typ ohne Verwendung eines expliziten Operator in int umgewandelt. Wird dies als Casting angesehen? oder dessen betrachtet Gießen nur, wenn ich eine explizite Umwandlung wie in performe:

int a = 10; 
int b = 5.5; 
double sum = double (a)/b; 

Ich weiß, es kann eine dumme Frage klingen, aber ich wollte nur sicher sein, um Konvertierungen.

+13

Sind Sie sicher, dass Sie "int b = 5.5;" schreiben? –

+3

Implizite Typumwandlungen heißen * coercions * (obwohl ich denke, dass es nicht 100% universal ist. Siehe [hier] (http: //en.wikipedia.org/wiki/Type_conversion "Wikipedia-Artikel für Typkonvertierungen.")). – Bakuriu

Antwort

16

"Casting" ist nur, wenn Sie eine explizite Umwandlung durchführen.

Dies gesagt, finden Sie den Begriff missbraucht überall im Internet und in verschiedenen Teams!

+3

Wenn es so oft missbraucht wird, ist vielleicht die Definition falsch, nicht ihre Verwendung. Schließlich wird die natürliche Sprache durch ihre tatsächlichen Gebräuche definiert * (trotz allem, was Grammatik-Nazis Ihnen glauben machen) *. Persönlich habe ich den Begriff "implizite Besetzung" oft gehört und nie als falsch empfunden. –

+3

@ BlueRaja-DannyPflughoef: Nein. Es handelt sich um eine Terminologie, die in einem internationalen Standard definiert ist, nicht um einen Umgangssprache auf der Straße. Dies ist _science_, nicht nur mit Ihrer "natürlichen Sprache" in der Kneipe. Der ganze Sinn des Standards besteht darin, die Mittel zur Beschreibung der Sprache eindeutig zu definieren, und in diesem Fall schließt das ein, was "Besetzung" bedeutet. Jedes Mal, wenn Sie diesen Begriff gehört haben, ist es falsch. Es ist so falsch wie zu sagen "du bist richtig und falsch". –

+8

Auch wenn der Ausdruck "cast" im C++ - Standard als explizite Konvertierung definiert ist, ist der Aufruf von "implizite Umwandlung" immer noch zu stark. Die natürliche Sprache ist nicht so scharf und trocken. Ich würde sagen "ungenau" oder "umgangssprachlich". Aber wo im Standard sagt das überhaupt? –

11

Erweiternde (wertschonende) Konvertierungen - Konvertierungen, deren Ergebnisse bei der Konvertierung in den ursprünglichen Typ den ursprünglichen Wert ergeben würden - werden im Allgemeinen implizit ausgeführt. Diese

char c = 'x'; 
int b = c; 

ist eine implizite Konvertierung. Explizite Umwandlungen heißen Umwandlungen.

int a = 1; 
double sum = static_cast<double>(a)/b; 

Hier a in eine double Gießen wird ausdrücklich als beide a getan und b sind int s; ohne den Cast würde keine Konvertierung stattfinden, was zu einer ganzzahligen Division führen würde, während eine Gleitkommadivision bevorzugt sein könnte, da sie präziser sein kann. Wenn man einen der Operanden von / zu double führt, was dazu führen würde, dass der andere auch implizit in einen double konvertiert wird, wäre die Division (und ihr Ergebnis) nun Gleitkomma.

Hatten Sie gerade double x = a; getan, können Sie da eine int mit der expliziten Umwandlung abschaffen zu einem double implizit umgewandelt wird (live example). Aus dem C++ 11 Standard, N3337 Entwurf

- Wenn einer der Operanden doppelt ist, wird der andere in Doppel umgewandelt.

Eine vollständige Liste der durchgeführten impliziten Konvertierungen finden Sie unter here.

+3

C++ macht implizit alle Arten von nicht-Wert-Erhaltung Konvertierungen. –

+1

Ich habe es nicht anders gesagt. – legends2k

+1

Aber Casting in double wäre nicht "(double) a"? – Phate01

1

Dies ist nicht Gießen, sondern Standardkonvertierung wie C++ Standard n3337 Zustände in

§ 4 Standard Conversions

4,5 Integer aktionen

1) A prvalue eines ganzzahligen anderen Typ als bool, char16_t, char32_t, oder wchar_t, deren Ganzzahlumwandlungsrang (4.13) ist kleiner als der Rang von int kann in einen prvalue des Typs int konvertiert werden, wenn int alle Werte des Quelltyps darstellen kann; Andernfalls kann der Quellprwert in einen Prvalue vom Typ unsigned int konvertiert werden.

+1

Höchste Zeit, hier den Begriff * promotion * zu erwähnen. – Wolf

+1

Werbeaktionen sind nicht die einzigen impliziten Typkonvertierungen. –

2

Casting ist explizite Umwandlung von Variablen in einem Ausdruck. Wie dies

int a = 10; 
int b = 5.5; 
double sum = double (a)/b; 

Während dieser

char c = 'a'; 
int b = c; 

.. ist ein Beispiel für implizite Typumwandlung (oder Zwang manchmal) wo Datentypen von einem Typ in einen anderen implizit gefördert werden [wie char int]

Werfen Sie einen Blick auf this Artikel für mehr Einblick.

Prost!

18

Wie in anderen Antworten erwähnt, werden die Umwandlungen explizit geschrieben. Der Standard bezeichnet sie als explizite Typkonvertierungen. [Expr.cast]/2:

Eine explizite Typkonvertierung kann (5.2.3), eine Art Umwandlungsoperator (dynamic_cast, static_cast, reinterpret_cast, const_cast) oder der Guss mittels funktioneller Notation ausgedrückt werden Notation.

Es gibt drei Arten von Ausdrücken, die wir Abgüsse nennen, in dem obigen Zitat erwähnt:

  • (T)expr. Im Standard wird dieses Formular Cast-Notation der expliziten Typkonvertierung genannt und wird auch allgemein als C-Style-Cast bezeichnet (wie es die in C verwendete und vererbte Syntax ist). (double) a ist ein Beispiel.

  • T(expr). Dies ist die Funktionsnotation (auch Funktionsstil-Cast genannt). Wird häufig zum Erstellen von Provisorien des Klassentyps verwendet, z. std::string("Hello World"). double(a) ist auch eine Funktion-Stil-Besetzung.

  • Und last but not least, die sogenannten Typumwandlung Betreiberstatic_cast<T>(expr),reinterpret_cast, const_cast und dynamic_cast. Dies sind die deutlichsten Notationen und sind individuell stärker eingeschränkt.

Die Verwendung all dieser wird in this Q/A behandelt.

Jede andere durchgeführte Konvertierung wird nicht als Cast bezeichnet.

+0

Fällt das Initialisieren von "Smart Pointers" unter die funktionale Notation Casting *? (Z. B. 'unique_ptr Wert (12)'). Ich kenne C++ nicht sehr gut, ich lese nur verwandte Fragen. – Kroltan

+0

Das ist eine Deklaration, kein Ausdruck. – Columbo

+0

Oh, und hat es einen bestimmten Namen? Es ist eine sehr merkwürdige Art Dinge zu erklären. – Kroltan