unsigned int operator und int operator das gleiche ?
-
DAs was ich jetzt sage sind reine Vermutungen.
Sofern folgendes geht:
int i; unsigned int ui; i = uidas ist ein impliziter Cast. Der Compiler castet also ein unsigned int automatisch in ein normales int
Der von dir Beschriebene Operator ist ein "Impliziter Cast"
der wird ausgeführt wenn vor einen = mit der Klasse eine andere klasse steht.Damit lässt sich der Cast auflösen:
->Compiler schaut ob er String in ein int casten kann
->da dies nicht geht schaut er ob er String auf etwas Casten kann was er in einen späteren Schritt in ein int Casten kann.
->Hier wird er fündig und castet in unsigned int
Kurzum er castet den String über den Operator in ein unsigned int und dieses dann auf ein int.So könnte ich mir es vorstellen. Ich denke aber das hier zumindest eine Warnung fällig wäre da man ja ggf falsche Wert in Length hat wenn die Grenzwerte überschritten werden (wenn das unsigned zu groß wird, wird wohl im signed Bereich eine negative Zahl auftauchen). Wie schon gesagt, so würde ich vermuten das es funktioniert. Am meisten lernt man wohl wenn man das ganze ausprobiert und schaut was passiert.
-
Erstmal danke fuer die hilfreichen Antworten

pumuckl schrieb:
Wenn ja wie weiss der Standardkonvertierungskonstruktor das so konvertiert werden muss?
hat nichts mit Konstruktoren zu tun, nur mit dem Operator den du selbst angeboten hast
Hier im Buch geht es aber um Konvertierungskonstruktoren. Ich zitiere vom Buch:
C++ von A bis Z schrieb:
Hinter dem Begriff Konvertierungskonstruktor verbirgt sich nichts anders als ein Konstruktor mit Parametern. Somit ist also jeder Konstruktor, den Sie bisher mit Parametern verwendet haben, ein Konvertierungskonstruktor - mit Ausnahme des Kopierkonstruktors.
Oder bringe ich da was durcheinander ?
Wie nennt man denn den Vorgang der das implizit macht ?PS: eine const-methode anzubieten, die einen nicht-konstanten Zeiger auf die Klasseninterna anbietet ist mehr als böse. Steht das wirklich so im Buch? Dann schmeiß es weg und sag welches das ist - damit wir allen Neulingen davon abraten können. Das zusammen mit einem so sinnfreien Konvertierungsoperator ist ziemlicher Müll.
Also das Buch heisst "C++ von A bis Z(2.Auflage) - Galileo Computing". Bis jetzt war ich eigentlich damit zufrieden. Also den Code habe ich nicht bearbeitet, ist direkt von der CD.
-
THE-E schrieb:
Hier im Buch geht es aber um Konvertierungskonstruktoren. Ich zitiere vom Buch:
C++ von A bis Z schrieb:
Hinter dem Begriff Konvertierungskonstruktor verbirgt sich nichts anders als ein Konstruktor mit Parametern. Somit ist also jeder Konstruktor, den Sie bisher mit Parametern verwendet haben, ein Konvertierungskonstruktor - mit Ausnahme des Kopierkonstruktors.
Oder bringe ich da was durcheinander ?
Deine Frage bezog sich aber nicht auf einen Konvertierungskonstruktor, sondern auf einen Konvertierungsoperator, nämlich den
operator unsigned int(). Konvertierungskonstruktoren sind übrigens nur Konstruktoren, die genau einen Parameter nehmen. Dein const char*- Konstruktor ist also einer. Allerdings gings ja nicht um den.Wie nennt man denn den Vorgang der das implizit macht ?
Implizite Konvertierung

-
THE-E schrieb:
Hier im Buch geht es aber um Konvertierungskonstruktoren. Ich zitiere vom Buch:
C++ von A bis Z schrieb:
Hinter dem Begriff Konvertierungskonstruktor verbirgt sich nichts anders als ein Konstruktor mit Parametern. Somit ist also jeder Konstruktor, den Sie bisher mit Parametern verwendet haben, ein Konvertierungskonstruktor - mit Ausnahme des Kopierkonstruktors.
Und schon wieder ein Fall, wo das A-Z-Buch negativ auffällt.
-
volkard schrieb:
THE-E schrieb:
Hier im Buch geht es aber um Konvertierungskonstruktoren. Ich zitiere vom Buch:
C++ von A bis Z schrieb:
Hinter dem Begriff Konvertierungskonstruktor verbirgt sich nichts anders als ein Konstruktor mit Parametern. Somit ist also jeder Konstruktor, den Sie bisher mit Parametern verwendet haben, ein Konvertierungskonstruktor - mit Ausnahme des Kopierkonstruktors.
Und schon wieder ein Fall, wo das A-Z-Buch negativ auffällt.
Wieso genau ?
Ich glaub das war eher mein Fehler. Im Beispiel oben also Thread-Topic ging es um Konvertierungsfunktion, nicht um Konvertierungskonstrukturen. Ich habe das uebersehen, daher auch bei mir die Verwirrung.
Also ICH habe den Themenwechsel uebersehen und faelschlicherweise gedacht es ginge um Konvertierungskonstrukturen.
-
THE-E schrieb:
Wieso genau ?
Weil das klingt, als seien
"Konvertierungskonstruktor"
und
"Konstruktor mit Parametern"
das selbe.
-
volkard schrieb:
THE-E schrieb:
Wieso genau ?
Weil das klingt, als seien
"Konvertierungskonstruktor"
und
"Konstruktor mit Parametern"
das selbe.Ah ok verstehe, aber ist dies dann nicht der Fall ?

-
Ich würde nur die Konstruktoren Konvertierungskonstruktoren nennen, die genau einen Parameter haben, aber nicht mehr als einen (, wie pumuckl vorhin auch geschrieben hat).
-
Zudem würde ich
explicit-Konstruktoren von Konvertierungskonstruktoren ausschliessen. Der folgende ist für mich kein Aufruf eines Konvertierungskonstruktors:std::vector<int> vec(7);Und falls ein Konstruktor nicht
explicitist und mehrere Parameter hat, von denen der zweite bis letzte Defaultwerte besitzen, kann man auch von Konvertierungskonstruktor sprechen. Nur gibts das relativ selten...class MyClass { public: MyClass(int i, double d = 5.0); }; MyClass obj = 3;
-
Nexus schrieb:
Zudem würde ich
explicit-Konstruktoren von Konvertierungskonstruktoren ausschliessen. Der folgende ist für mich kein Aufruf eines Konvertierungskonstruktors:std::vector<int> vec(7);Ja, damits eine Typumwandlung wird, muß man es deutlicher hinschreiben.
std::vector<int> vec=static_cast<std::vector<int> >(7);
-
volkard schrieb:
Ich würde nur die Konstruktoren Konvertierungskonstruktoren nennen, die genau einen Parameter haben, aber nicht mehr als einen (, wie pumuckl vorhin auch geschrieben hat).
Und nicht explicit sind?
-
THE-E schrieb:
ich bin gerade auf folgenden Code im Buch gestossen:
... grauenhafter Code ...
THE-E schrieb:
Also das Buch heisst "C++ von A bis Z(2.Auflage) - Galileo Computing"
Aha. Das Buch scheint nicht viel zu taugen -- es sei denn, die "Macken" sind absichtlich dort, zu Lehrzwecken / als Negativbeispiel.
Kopierkonstruktor und Zuweisungsoperator fehlen. Das führt unweigerlich zu Speicherlecks und/oder Destruktoren, die denselben Speicherblock mehr als einmal freigeben wollen.
Der Konvertierungsoperator ist ziemlich Banane. Konvertierungen sollten den Sinn des Werts erhalten, der von einem Typ zum anderen konvertiert wird. Zeichenketten haben nicht viel mit Ganzzahlen zu tun. Ja, die Länge einer Zeichenkette ist eine Ganzzahle. Dafür kann man ja auch eine size oder length Methode anbieten. Aber als Konvertierungsoperator ist das unpassend.
Const-Correctness wird verletzt. Die folgende Funktion kann einen "konstanten" String verändern, wobei sie es eigentlich nicht dürfen sollte:
void const_incorrect(String const& s) { int l = s; // mit-den-Augen-roll char* p = s.get_String(); // legal, da get_String const ist if (l>0) { p[0] = 'X'; // Oops! Ich habe einen "konstanten" String geändert. } }kk