001
03.08.2009, 17:06 Uhr
0xdeadbeef
Gott (Operator)
|
In diesem speziellen Fall hätte ich wohl die Konstruktorsyntax benutzt, also
C++: |
uint j = uint(result.length() - 2);
|
, aber auf Typgleichheit zu achten ist sicher keine ganz blöde Idee - es ist durchaus denkbar, dass std::string::size_type und uint Typen unterschiedlicher Länge sind.
(int)<ausdruck> ist in C++ kein wirklich normaler Cast mehr, eher eine Kompatibilitätskiste. Die Syntax ist ziemlich unübersichtlich; Ausdrücke wie
C++: |
double d = (double) i / j;
|
können schon mal Kopfkratzen verursachen, was der Cast jetzt eigentlich castet, wenn man nicht gerade viel mit C-Casts arbeitet. Außerdem können, wenn man mit C-Casts nicht sehr vorsichtig ist, einem schon mal aus versehen cv-Qualifier verloren gehen:
C++: |
foo const *p = &bar;
foo *q = (foo*) p; // Brandgefährlich foo *r = static_cast<foo*>(p); // Compiler-Fehler!
|
Insbesondere in Templates kann das von großer Bedeutung sein. C-Casts casten halt brutal durch; man könnte sie mit Recht Brechstangencasts nennen. Die *_cast-Operatoren dagegen verstehen die Sprache und verhalten sich entsprechend. Ein anderes Beispiel:
C++: |
class foo : private bar { };
foo f; bar *b = (bar*)&f; // Brachial durchgecastet bar *b2 = static_cast<bar*>(&f); // Compiler-Fehler, f::bar ist private.
|
Siehe auch www.acm.org/crossroads/xrds3-1/ovp3-1.html -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 03.08.2009 um 17:14 Uhr von 0xdeadbeef editiert. |