Unterschied: Initialisierung/Deklaration/Definition/Zuweisung
-
Hallo liebe Community!
Ich habe das tolle Buch von Jürgen Wolf (C++ von A bis Z) und bin noch relativ am Anfang... dort wird folgendes Beschrieben, stehe aber auch auf der Leitung
> Wenn Sie eine Variable initialisieren, so ist dies noch lange keine Zuweisung. Ist das nicht ein und dasselbe? Nicht ganz. Zwar erfolgen die Zuweisung und die Initialisierung mit dem Gleichheitszeichen, aber zum einen handelt es sich ja hier um den Begrenzer =, und zum anderen um den Opterator =, also um zwei verschiedene Dinge, die mit ein und demselben Zeichen einhergehen. Eine Initialisierung geschieht immer erst beim Anlegen einer Variablen, während eine Zuweisung lediglich in Bezug auf ein bereits existierendes Objekt ausgeführt werden kann. <<
Quelle: C++ von A bis Z | ISBN: 9783836214292
Jetzt ist meine Frage... was ist der (normal erklärt, ohne Fachbegriffe - Deklaration ist auch ein Fachbegriff :P) Unterschied zwischen einer Initialisierung und einer Zuweisung? Einfach ein Beispiel vielleicht kurz erklärt. Ähnlich ist es ja mit der Deklaration und der Definition.
Beispiel: int name; ist eine Deklaration und name = 17 währe die Definition. Hab ich das richtig interpretiert? Und gibt es eigentlich einen Unterschied zwischen Initialisierung und Deklaration bzw zwischen Definition und Zuweisung? Ist doch irgendwie das selbe oder??
-
Initialisierung:
int zahl;
Zuweisung:
int zahl; zahl = 10;
Ist doch irgendwie das selbe oder??
Hum, einen klaren Unterschied kann ich auch nicht erkennen. Bin mal gespannt.
-
Initialisierung setzt den Wert einer Variable, sobald sie erstellt wird (Speicher angefordert, evtl. Konstruktor aufgerufen) - eben initial. Zuweisung hingegen ist das nachträgliche Setzen eines Wertes.
int a = 325; // Initialisierung int b; b = 357; // Zuweisung
Zuweisung ist unter bestimmten Umständen nicht möglich, zum Beispiel wenn eine Variable
const
-qualifiziert oder eine Referenz ist, oder wenn der Typ den Zuweisungsoperator nicht unterstützt.Ansonsten siehe F.A.Q.
-
Vielen vielen Dank!!!
Jetzt hab ich das auch verstanden, schade das man in so einem wirklich schön geschriebenen Buch nicht einfach sagen kann ... das der Unterschied so gering ist und welcher das ist!
Also Nexus, jetzt hab ich es kapiert worin der Unterschied liegt, fehlt nurnoch Deklarisation und Definition
Und wo der Unterschied zu deiner Erläuterung ist
Aber schonmal vielen dank, auch an Kóyaánasqatsi!
-
Achja was ich noch vergessen habe (kann leider auf die schnelle meinen Beitrag nicht editieren) das FAQ bzw diesen Beitrag habe ich bereits gelesen.. aber der schaffte bisher auch noch nicht 100% klarheit
-
Zum Deklaration/Definition zitiere ich einfach mal den Standard:
3.1/3
//[Example: all but one of the following are definitions: int a; // defines a extern const int c = 1; // defines c int f(int x) { return x+a; } // defines f and defines x struct S { int a; int b; }; // defines S, S::a, and S::b struct X { // defines X int x; // defines nonstatic data member x static int y; // declares static data member y X(): x(0) { } // defines a constructor of X }; int X::y = 1; // defines X::y enum { up, down }; // defines up and down namespace N { int d; } // definesN and N::d namespace N1 = N; // defines N1 X anX; // defines anX //whereas these are just declarations: extern int a; // declares a extern const int c; // declares c int f(int); // declares f struct S; // declares S typedef int Int; // declares Int extern X anotherX; // declares anotherX using N::d; // declares N::d —end example]
-
Ich hatte vor erst normale Bücher zu lesen bis ich mir das von Stroustrup gebe.
Ist das ein Ausschnitt aus seinem Buch? Falls nein gibts dazu einen Link Online wo der ganze Standard drin ist? (Stroustrup's seite kenne ich zwar, aber HTML und CSS scheint er nicht zu kennen)
Ich wollte eigentlich nur eine logische erklärung, und nich das, was alles geht...
zB "Der Unterschied zwischen Initialisieren und Deklarieren ist, dass bei der Initialisierung sofort ein Wert zugewiesen wird und bei Deklarieren nur der Compiler mit einem neuen (objekt?) vertraut gemacht wird.." war jetzt geraten, kann also ziemlich falsch sein
-
1. http://www.research.att.com/~bs/bs_faq.html#looks
2. http://www.open-std.org/jtc1/sc22/wg21/
Hier kannst du den Draft runterladen. (unter anderem ebenfalls den Draft des neuen Standards). Die Originalversionen sind kostenpflichtig.
3. Noch ein Ausschnitt aus dem Standard:
3.1 Declarations and definitions [basic.def]
1 A declaration (clause 7) introduces names into a translation unit or redeclares names introduced by previous
declarations. A declaration specifies the interpretation and attributes of these names.
2 A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it
contains the extern specifier (7.1.1) or a linkage-specification24) (7.5) and neither an initializer nor a
function-body, it declares a static data member in a class declaration (9.4), it is a class name declaration
(9.1), or it is a typedef declaration (7.1.3), a using-declaration (7.3.3), or a using-directive (7.3.4).
-
daybreak schrieb:
Ich wollte eigentlich nur eine logische erklärung, und nich das, was alles geht...
War meine Erklärung und die der FAQ nicht logisch genug? Falls nein, wäre es vielleicht hilfreich, wenn du sagen könntest, was du nicht verstanden hast. Zumindest hilfreicher als "bitte solange erklären, bis ich es verstehe" oder "ich hab noch nicht 100% Klarheit".
-
Doch deine Erklärung war sogar spitze, aber da gings halt noch nicht um Deklaration und Definition.
Mittlerweile hab ich es glaub ich sogar verstanden.
Deklaration legt kein Speicherobjekt(Variable) an und erzeugt 0 Maschinencode.
Definition übernimmmt dann diesen Part. Bei Deklaration wird dem Compiler nur gesagt, welchen Typ irgendein Bezeichner hat. Das heißt man kann unendliche Deklarationen machen, jedoch nur eine Definition dazu. Oder hab ich es falsch Aufgefasst?