Unterschied Initalisieren - Zuweisen, deklr-defin

Hallo!

Ich nehme gerade das Buch „C++ in 21 Tagen“ durch. Bin beim 10ten Tag.(Also noch Anfänger)
Aber mir stellen sich jetzt wieder folgende Fragen:

Was genau ist jetzt der Unterschied zwischen:
deklarieren - definieren
zuweisen - initialisieren

Ich habe schon danach gegoogelt und in diversen Foren gelesen, aber bin nie wirklich schlauer dadurch geworden :wink:

Gruß,
Michi

Hallo,

Was genau ist jetzt der Unterschied zwischen:
deklarieren - definieren

Eine Deklaration weist einem Objekt eine Signatur zu. Also z.B. einer Variablen eine Typ (int i:wink:, oder einer Funktion eine Signatur (int add(int a, intb ):wink:.
Was eine Definition bei C++ ist, weiss ich leider nicht. Kannst du mal ein Beispiel für eine Defintion geben?

zuweisen - initialisieren

Jede Initialisierung ist auch eine Zuweisung.
Ein Initialiesierung ist die erste Zuweisung eines Wertes an eine Variable, und findet normalerweise mit er Deklaration zusammen statt.

Also
int i = 0;
wäre eine Typische Deklaration mit Initialisierung.
Wenn du später dann
i = 2 * k;
oder sowas schreibst, ist es „nur noch“ eine normale Zuweisung.

Ich hoffe, dass dir meine Ausführung ein wenig geholfen hat.

Grüße,
Moritz
P.S. verschluck dich nich zu sehr an den Begrifflichkeiten. Wenn du weißt, wie der Code funktioniert, ist das viel wichtiger :wink:.

Was genau ist jetzt der Unterschied zwischen:
deklarieren - definieren

Das könnte man so ausdrücken, dass eine Deklaration nur die Synatx eines Symbols festlegt, während eine Definition sich um die Semantik kümmert. Ein einfache Beispiel:

// Deklaration
int fuenf( void );

// Definition (kann gleichzeitig Deklaration sein)
int fuenf( void ) { return 42; }

zuweisen - initialisieren

Eine Zuweisung ist noch einigermaßen trivial:

int a, b;

// Der Variable a den Wert 42 zuweisen
a = 42;

// Der Variable b den Wert von Variable a zuweisen
b = a;

(Deshalb bezeichnet man den Operator „=“ auch als Zuweisungsoperator.)

Initialisierung bezeichnet den Vorgang, den Zustand eines Objekts bei der Erstellung festzulegen. Das wird dann hauptsächlich in der objektorientierten Programmierung wichtig:

class foo {
 private:
 const int bar;

 public:
 // Konstruktor der Klasse. Das ist die einzige Stelle, an
 // der "bar" initialisiert werden kann!
 foo( int x ) : bar(x) {}
};

Im Konstruktor kann hinter dem Doppelpunkt eine Kommagetrennte Liste von Ausdrücken stehen, die die entsprechenden Konstruktoren für Attribute der Klasse aufrufen.

Hallo Michael.

Was genau ist jetzt der Unterschied zwischen:
deklarieren - definieren

Beim Deklarieren legst Du Namen und Aufrufsyntax der Variablen
oder der Funktion (Funktionsargumente und Rückgabewert) fest,
so dass der Compiler ab diesem Zeitpunkt eine Syntaxprüfung
vornehmen kann. Dabei wird aber noch kein Speicher reserviert.

Beim Definieren dagegen reserviert der Compiler auch
Speicher für die Variable bzw. die Funktion mit.

Da der Compiler bei einer Variablendeklaration wie z.B.

int a;

auch gleich die vollständige Information
über den benötigten Speicher hat, kann er auch gleich Speicher
für die Variable reservieren. Es handelt sich somit um
eine Deklaration (=Bekanntmachen) + Definition (=Speicherbelegen).

Für eine reine Deklaration einer Variablen in C verwendet
Du deshalb das Schlüsselwort extern :

extern int a;

bedeutet dann, dass die Variable
nicht hier, sondern gewöhnlich in einer anderen (externen) Datei
definiert wird.

Eine Funktion deklarierst Du, indem Du nur ihren Funktionskopf
angibst:

float function(float);

Dies ist eine Kurzschreibweise für

extern float function(float);

Die Funktion wird definiert , indem Du
sie vollständig mit Kopf und Rumpf aufschreibst.

zuweisen - initialisieren

Das hat Moritz ja schon richtig beschrieben: die
Initialisierung ist eine spezielle Zuweisung,
nämlich die erste.

Gruß,
-Andreas.

Hallo nochmal!

Vielen DAnk an euch alle! Ich hab’s geschnallt!

Gruß,
Michi

Initalisieren
Hallo Michi,

Es ist noch anzumerken, dass die Initialisierung auch vom Laufzeitpaket erfolgen kann.

Meist werden alle statischen Variablen, welchen kein Wert != 0 im Programm zugewiesen wird, vor dem eigentlichen Aufruf von main() mit dem Wert ‚0‘ vorbelegt.

Manche weisen Zeigern eine bestimmte Speicheradresse zu, deren verwendung zu einem Laufzeitfehler führt, somit können nicht initialisierte Zeiger erkannt werden.

Gut aufpassen muss man bei auto Variablen, also lokale Variablen, welche innerhalb eine Funktion verwendet werden und auf den Stack abgelegt sind. Werden diese nicht explizit initialisiert, enthalten sie „zufällige“ Werte.

MfG Peter(TOO)