kein NULL in C++?
-
Klar ist es möglich:
<cstddef>inkludieren undNULLnutzen- C++0x-Fähigen Compiler haben und
nullptrnutzen
EDIT: Ja, ich dachte es sei ein eingebauter Typ...
-
gast1987 schrieb:
Hallo zusammen,
hab vor kurzem angefangen, mich näher mit C++ zu beschäftigen. Von Java kenn ich es so, dass man Objekte mit null initialisieren kann. Mein C++-Compiler wirft mir bei folgendem Code aber einen Fehler:
#include "test2.h" class Test { // Attribute private: string s int nr; Test2 t; public: // Default-Konstruktor mit Initialisierung der Attribute Test(){ s = ""; nr = 0; t = NULL; }; }Ist es in C++ nicht möglich, Objekte mit null vorzuinitialisieren?
Danke schonmal!
Viele Grüße,
Dann wirf dein Java Wissen schnell mal über den Haufen, sonst wirst du in C++ ganz schnell auf die Nase fallen. In C++ werden Objekte NICHT per Referenzvariablen gehandhabt, das bedeutet, dass bei folgender Funktion:
void tu_was_super_tolles_mit_meinem_objekt(Hugo hugo) { // tu was }das Objekt kopiert wird und die Kopie an die Funktion übergeben wird! Deshalb kann man Objekte auch nicht "nullen", sehr wohl jedoch Zeiger auf Objekte, mit welchen man in C++ jedoch sehr sparsam umgeht.
-
Nein, das geht so nicht. Was macht das in Java? Wenn du einfach eine Defaultkonstruktion haben willst, dann mach einfach gar nichts. In C++ haben Objekte keine Zeigersemantik wie in Java. Das ist ein ganz wichtiger Unterschied.
edit: Zu langsam. In diesem Sinne:
314159265358979 schrieb:
Dann wirf dein Java Wissen schnell mal über den Haufen, sonst wirst du in C++ ganz schnell auf die Nase fallen.
QFT.
-
EOutOfResources schrieb:
Klar ist es möglich
Nein, ist es nicht. Man kann nur Zeiger mit
nullptrinitialisieren.Anders als in Java sind Objekte in C++ tatsächlich Objekte mit Wertsemantik und nicht nur Referenzen. Deshalb existieren sie seit dem Zeitpunkt ihrer Definition. Indirektionen müssen explizit über
&(Referenz) oder*(Zeiger) gekennzeichnet werden, ansonsten handelt es sich um den Wert.
-
gast1987 schrieb:
t = NULL;Dazu müsste t ein Zeiger sein, in Deinem Beispiel ist es aber ein Objekt.
-
Belli schrieb:
in Deinem Beispiel ist es aber ein Objekt.
Das steht nirgends.
-
Ja, Test2 könnte natürlich auch ein typedef auf einen Zeiger sein, oder den Konstruktor Test2(Irgendwas*) haben

-
gast1987 schrieb:
Test(){
s = "";
nr = 0;
t = NULL;
};Und hinter eine Funktion gehört normal kein Semikolon.
-
bmario schrieb:
gast1987 schrieb:
Test(){
s = "";
nr = 0;
t = NULL;
};Und hinter eine Funktion gehört normal kein Semikolon.
aber wieso ist es dann erlaubt?!?
-
Und was heißt überhaupt in diesem Zusammenhang 'normal'? Gehört es eventuell 'unnormal' dahin?
-
Skym0sh0 schrieb:
aber wieso ist es dann erlaubt?!?
Wer hat das gesagt? Nur weil es ein Compiler toleriert, bedeutet das noch gar nichts.
-
Skym0sh0 schrieb:
bmario schrieb:
gast1987 schrieb:
Test(){
s = "";
nr = 0;
t = NULL;
};Und hinter eine Funktion gehört normal kein Semikolon.
aber wieso ist es dann erlaubt?!?
Ist es doch gar nicht.
Dein Compiler meckert nicht drüber, weil er ein total Lieber ist.
-
Skym0sh0 schrieb:
bmario schrieb:
gast1987 schrieb:
Test(){
s = "";
nr = 0;
t = NULL;
};Und hinter eine Funktion gehört normal kein Semikolon.
aber wieso ist es dann erlaubt?!?
Es gehört nicht zur Funktion, sondern kennzeichnet eine leere Deklaration nach der Funktion.
-
ipsec schrieb:
Es gehört nicht zur Funktion, sondern kennzeichnet eine leere Deklaration nach der Funktion.
In welcher Sprache gibt es die leere Deklaration?
Es gibt was ähnliches hier in C++, das leere Kommando. Aber das geht nur innerhalb von Funktionen.
-
volkard schrieb:
ipsec schrieb:
Es gehört nicht zur Funktion, sondern kennzeichnet eine leere Deklaration nach der Funktion.
In welcher Sprache gibt es die leere Deklaration?
In unserem geliebten C++

Guck ma auf http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf im Anhang A.6.
-
ipsec schrieb:
In unserem geliebten C++

Guck ma auf http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf im Anhang A.6.
Seltsam. Hast recht.
-
Belli schrieb:
Und was heißt überhaupt in diesem Zusammenhang 'normal'? Gehört es eventuell 'unnormal' dahin?
Nein, auch nicht unnormal. Aber wie ipsec zeigte, ist ein Semikolon eine leere Deklaration und damit erlaubt. Da dem Compiler Whitespaces zwischen Token egal sind, ist ein Semikolon an der Stelle zwar erlaubt, aber trotzdem nicht richtig. Das wollte ich mit "normal" ausdrücken

-
volkard schrieb:
ipsec schrieb:
In unserem geliebten C++

Guck ma auf http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf im Anhang A.6.
Seltsam. Hast recht.Den Abschluss eine Leeranweisung ist auch über das expression-statement möglich.
-
Dann bleibt mir nur noch die kleine Frage
int main() { ;//Deklaration oder Anweisung? }
-
volkard schrieb:
Dann bleibt mir nur noch die kleine Frage
int main() { ;//Deklaration oder Anweisung? }Ambigious
