Der (Nichts-)Datentyp Void
-
Weil der globale _Operator_ new nur für die Speicherallozierung zuständig ist, die das _Schlüsselwort_ new (Also ein new-Ausruck) benötigt. Tachyon hat also etwas anderes gemeint als Bashar und beide haben Recht

-
Decimad schrieb:
Weil der globale _Operator_ new nur für die Speicherallozierung zuständig ist, die das _Schlüsselwort_ new (Also ein new-Ausruck) benötigt.
falsch.
die operator new gibt einen void* zurück und der operator new gibt einen spezifischen zeiger zurück.(DIE globale funktion namens operator new gibt einen void* zurück. DER globale operator namens operator new gibt einen spezifischen zeiger zurück. der operator new benutzt die operator new, um speicher zu besorgen und ruft dann den konstruktor auf und gibt den vollkonstruierten speicher zurück.)
-
volkard schrieb:
(DIE globale funktion namens operator new gibt einen void* zurück. DER globale operator namens operator new gibt einen spezifischen zeiger zurück. der operator new benutzt die operator new, um speicher zu besorgen und ruft dann den konstruktor auf und gibt den vollkonstruierten speicher zurück.)
Naja, ganz klar ist das auch nicht, zumal Operatoren auch Funktionen sind.

Aber ich denke, wir wissen alle, was gemeint ist...

T* Ptr = new T; // new-Operator -> T* void* Mem = operator new(sizeof(T)); // operator new -> void*
-
Nexus schrieb:
Naja, ganz klar ist das auch nicht, zumal Operatoren auch Funktionen sind.

falsch. der operator new und der operator sizeof verarbeiten einen typen, das können funktionen nicht.
T* Ptr = new T; // new-Operator -> T* void* Mem = operator new(sizeof(T)); // operator new -> void*aber "new-Operator" und "operator new" sind keine guten unterscheidungen, zumal der "new-Operator" den in c++ namen "operator new" trägt.
-
volkard schrieb:
der operator new und der operator sizeof verarbeiten einen typen, das können funktionen nicht.
Stimmt schon. Trotzdem finde ich die Unterscheidung nur auf Grund des Artikels fragwürdig. Operatoren sind schlussendlich beides...
Am klarsten ist es wohl, wenn man einfach nur
newrespektiveoperator newsagt.
-
Nexus schrieb:
volkard schrieb:
der operator new und der operator sizeof verarbeiten einen typen, das können funktionen nicht.
Stimmt schon. Trotzdem finde ich die Unterscheidung nur auf Grund des Artikels fragwürdig. Operatoren sind schlussendlich beides...
Warum das denn?
Ist printf() ein Operator? Wäre mir neu. Und genausowenig ist die Funktion operator new ein Operator.Am klarsten ist es wohl, wenn man einfach nur
newrespektiveoperator newsagt.aber beide heißen
operator newdas ist fakt. eure unterscheidungen sind erfunden.
wenn du es klar machen willst, sag bei der funktion immer "Funktion" dazu und beim operator immer "Operator". ausnahmsweise ien grund für großschrift.
also
- die Funktion operator new
- der Operator operator newaber bereits
- die Funktion new
- der Operator new
wird mißverstanden.
-
volkard schrieb:
Am klarsten ist es wohl, wenn man einfach nur
newrespektiveoperator newsagt.aber beide heißen
operator newdas ist fakt. eure unterscheidungen sind erfunden.
Der Operator
newheißtoperator new? In welchem Kontext?
-
volkard schrieb:
Ist printf() ein Operator? Wäre mir neu. Und genausowenig ist die Funktion operator new ein Operator.
Sind für dich Überladungen von
operator+undoperator=auch keine Operatoren?volkard schrieb:
wenn du es klar machen willst, sag bei der funktion immer "Funktion" dazu und beim operator immer "Operator". ausnahmsweise ien grund für großschrift.
also
- die Funktion operator new
- der Operator operator newAbgesehen davon, dass das niemand tun wird (vor allem "Operator operator new" zu sagen), bezweifle ich auch, dass das wirklich Klarheit schafft.
Und wenn man von
newspricht, denkt man immer zuerst an den Operator, der Speicher anfordert und gleichzeitig Objekte konstruiert. Beioperator newdenkt man schon eher an die reine Speicheranforderung. Oft erschliesst sich das sowieso aus dem Kontext. Aber mit "die operator new" und "der operator new" ist sicher niemandem geholfen...
-
Bei sauberen C++ Design, sollte sich die Anwendung von void * auf eigentlich wenige Faelle beschraenken.
- Kompativlitaet zu C
Klar, C arbeitet gern und oft mit untypisierten Zeigern.- als abstracter Datentyp, der einfach nur eindeutig sein muss ...
Oftmals verwendet man sowas wie Handles. Die einfach ein Object beliebigen Types eindeutig referenzieren soll. meist nimmt man dann die adresse des objects und verkauft es als "handle" weiter.
Die Dinger ueber templates zu typisieren macht eher weniger Sinn, weil der Anwender dann da typen reinbekommt, die ihm wahrscheinlich(bewusst) keinerlei Mehrwert bieten, und eine generizitaet auf seiten des anwenders einfach verhindern.
Nen Interface zu bauen was gar nix kann, und jegliches anderes interface davon abzuleiten waer glaub ich auch ned im Sinne des OOP Gedanken ... da wuerd ich nen void * bevorzugen.- als Transportmedium fuer unbestimmte Daten, bzw als reine Adresse fuer die Speicherverwaltung.
Ob man bei zeigern auf Speicherbereiche, wo man "am Anfang" gar ned weiss was drinne steht, und erst spaeter ermittelt, was genau da drinne iss und das dann castet, ob man da char * oder void * nimmt ist eher geschmackssache. Ich find void ned so verkehrt, weil es sind zwar physisch immer Bloecke von Bytes, aber logisch kann man schon weiter abstrahieren ...Ciao ...
-
RHBaum schrieb:
- als abstracter Datentyp, der einfach nur eindeutig sein muss ...
Das ist aber unsauber und in C++ nicht wirklich nötig. Meistens kennt man den Typen, und dann kann man auch typsichere Sprachmittel verwenden. Falls es doch noch Fälle gibt mit dynamischen Typen, gibt es auch entsprechende Methoden, die
void*in den Schatten stellen (z.B. Boost.Any, Boost.Variant).RHBaum schrieb:
Die Dinger ueber templates zu typisieren macht eher weniger Sinn, weil der Anwender dann da typen reinbekommt, die ihm wahrscheinlich(bewusst) keinerlei Mehrwert bieten, und eine generizitaet auf seiten des anwenders einfach verhindern.
Typsicherheit ist kein Mehrwert?
Und wie sollte durch Templates die Generizität verhindert werden?RHBaum schrieb:
- als Transportmedium fuer unbestimmte Daten, bzw als reine Adresse fuer die Speicherverwaltung.
Ob man bei zeigern auf Speicherbereiche, wo man "am Anfang" gar ned weiss was drinne steht, und erst spaeter ermittelt, was genau da drinne iss und das dann castet, ob man da char * oder void * nimmt ist eher geschmackssache. Ich find void ned so verkehrt, weil es sind zwar physisch immer Bloecke von Bytes, aber logisch kann man schon weiter abstrahieren ...Auch das trifft man bei hinreichender Abstraktion kaum an. Höchstens, wenn man eigene Speicherverwaltung implementiert. Es kommt aber selten vor, dass man mal x Bytes allokiert, nicht weiss, wofür die stehen, und dann willkürlich irgendeinen Typen da reinsetzt...
-
Bashar schrieb:
Der Operator
newheißtoperator new? In welchem Kontext?Hast recht. In keinem Kontext.
Der Operator "+" heißt auch nicht "operator +", sondern nur "+", während die ihn implementierende Funktion "operator +" heißt. Sehr sonderbar.