Definition, Deklaration
-
Wo ist da der exakte Unterschied?
Bei
void hallo();
ist es eine Deklaration
bei
int wert1;
auch.
ist die Definition jetzt nur der Rumpf einer Funktion ( der Inhalt zwischen den Klammern?)
-
Hi,
void hallo();
ist es eine Deklaration
bei
int wert1;auch.
Nein.
Also wenn wir von Objekten sprechen, dann bedeutet definieren ein Objekt instanziieren (z.B. int a; char b; KlasseX c;)
Eine Deklaration ist da z.B. das Schreiben einer Klasse.Bei Funktionen bedeutet der Funktionskopf mit einem ; der Prototyp einer Funktion, was gleich einer Funktionsdeklaration ist.
Implementierst du die Funktion, so ist dies eine Definition.Bei Objekten gibt es außerdem noch eine Initialisierung.
int a = 5;
So etwas ist bei Funktionen nicht möglich.
Mfg MAV
-
Hallo,
FAQ schon gelesen?
-
Wieso nein?
In der FAQ steht
int i;
ist eine deklaration.
Was soll das denn sonst sein?
-
Es gleichzeitig Deklaration und Definition. Definitionen sind immer (?) auch automatisch Deklarationen.
-
Hallo,
int i;
im Namespace-Scope oder innerhalb einer Funktion ist eine Definition und das steht auch in den FAQ. Eine Definition ist allerdings immer auch eine Deklaration, aber auch das steht dort.
-
Das ist bereits eine Definition. Was anderes steht aber auch nicht in den FAQ.
-
Ich weiß ich bin ein schwieriger Fall
aber ich tu mich echt schwer damit ( FAQ gelesen aber nicht wirklich verstanden
):
Könnte das jemand für mich noch einfacher und evt. noch allg. formulieren:
Deklaration:
Ein Programmausdruck der einen Namen in einen Scope ein- bzw. wiedereinführt.Definition:
Eine Deklaration die die Details einer Entität bekannt macht oder, im Fall von Variablen, die dazu führt, dass Speicher für die Entität reserviert wird.Eine Deklaration einer Klasse (struct, class, enum, union) Funktion oder Methode wird zu einer Definition, wenn auf die Deklaration ein in geschweiften Klammern eingeschlossener Block folgt.
Variablendeklarationen sind immer auch Definitionen es sei denn, der Deklaration ist ein extern vorangestellt.Initialisierung:
Eine Definition mit expliziter Anfangswertzuweisung.Initialisierung ist klar denke ich mal ( int i=5;).
-
Jetzt bin ich aber auch verwirrt, also ist class C {} auch eine Definition?
Und:
C Instance;
?ist das dann auch eine Definition?
wenn jede Definition eine Deklaration ist, verstehe ich den Unterschied nicht...
-
Eine Deklaration wäre
class X;
die passende Definition (bekanntgabe was dieses X nun wirklich ist)
class X {};Deklaration sagt: es gibt etwas (zB es gibt eine Klasse
- Definition ist die Erklärung was dieses etwas nun genau ist (zB die Klasse X hat 0 Member und 0 Methoden).
-
Hem, also in "Effektic C++ Programmieren" steht eigentlich was anderes drin.
Deklaration ist nur die Schnittstelle, die man anderen "zeigt", die z.B. in der header-Datei drin steht. Bsp.:
class Auto { public: void beschleunige(int kmh); void bremse(); };
Und die Definition ist dann halt die eigentliche Implementierung der Methoden in der cpp-Datei. Soll heißen, in der cpp-Datei wird dann letztendlich die Schnittstelle (Deklaration) genauer implementiert (Definition). Klingt doch ganz logisch?
Das was ShadeOfMine meint, ist aber was anderes! Das ist Forward-Deklaration, und nicht einfach Deklaration. Forward-Deklaration ist z.B.:
class Auto;
-
Ich denke Scott Meyers spielt darauf an, dass in der Klassendefinition die Memberfunktionen lediglich deklariert werden, und in einer eigenen Übersetzungseinheit definiert werden müssen.
Die Begriffe stammen ansonsten direkt aus dem C++-Standard, offizieller gehts nichtForward-Deklaration ist übrigens soweit ich weiß ein von Pascal stammender Begriff, der umgangssprachlich für Klassen-Deklarationen verwendet wird.
-
Artchi schrieb:
Deklaration ist nur die Schnittstelle, die man anderen "zeigt", die z.B. in der header-Datei drin steht.
Shade Of Mine schrieb:
Deklaration sagt: es gibt etwas (zB es gibt eine Klasse
Also ich seh hierin nich wirklich n unterschied. Bis auf den Aspekt den Bashar mit eingebracht hat sagen beide Erklärungen doch genau das Selbe?! (ebenso mit der Definition) Shade hats halt etwas allgemeiner gehalten...
-
Kennst du Forward-Deklaration? Dann wüsstest du, das Shade und ich was unterschiedliches meinen. Schau dir bitte meine Code-Beispiele an.
Mit Forward-Deklaration kannst du z.B. bei verwendung von Pointern in deiner Header-Datei, dir das includieren einer Deklaration ersparen. Aber du könntest nicht auf die Methoden des Typs des Pointers zugreifen. Weil dir letztendlich doch die Deklaration fehlt.
// #include "auto.h" class Auto; // Forward-Deklaration, brauche das obige include nicht! class Strasse // Deklaration { private: Auto *auto; // Typ Auto wurde Forward-Deklariert, kann ich soweit benutzen. };
Will ich aber auf die Methoden von Auto zugreifen, reicht die Forward-Deklaration nicht mehr aus. Da muß ich dann doch die richtige Deklaration "bekannt" machen, in dem ich z.B. die entsprechende Header-Datei includiere.
Wenn DAS kein Unterschied ist, dann weiß ich auch nicht weiter.
-
Artchi schrieb:
class Strasse // Deklaration { [..] };
Ne, das ist eine Definition.
class Foo; //Deklaration class Foo //Definition { void f(); //Deklaration void f2() {} //Definition } i; //Definition extern Foo i2; //Deklaration
Siehe Humes FAQ (bens.c-plusplus.info)
-
Hallo,
nur um das noch mal klar zu machen. Eine forward-declaration ist
erstmal nichts weiter als eine Deklaration. class Foo; ist eine Deklaration. Hier wird deklariert, dass Foo ein benutzerdefinierter Typ ist (der Typ selbst, nämlich Foo, wird hingegen nicht beschrieben).
Das forward soll nur darauf hinweisen, dass, im Gegensatz zu den sonst in der Regel anzutreffenden Klassendeklarationen, keine unmittelbare Definition folgt.Normalerweise hat man sowas:
class Foo // Deklariert Foo als Udt... { // ...und definiert Foo };
Hier haben wir neben der Deklaration gleichzeitig die Definition. Das ganze ist eine Definition genauer eine Klassendefinition.
Bei einer forward-declaration folgt hingegen keine Definition.
Letztlich ist das "forward" redundant, da keine neue Information hinzukommt (die Bedeutung des Begriffs ist bereits durch "Deklaration" beschrieben). Es wird nur explizit etwas weggenommen. Nämlich die Möglichkeit, dass es sich bei der Deklaration gleichzeitig um eine Definition handelt (zur Erinnerung: Jede Definition ist auch eine Deklaration).
@Artchi
Deine Verwirrung kommt schlicht daher, dass du die Begriffe falsch anwendest.
Zwar gab es im frühen Mittelalter wohl mal einige in der C++ Community, die eine Klassendefinition (also eine Deklaration eines Names als udt mit anschließendem {}-Block zur Definition des Typs) als Klassen-Deklaration bezeichneten, mit der Einführung des C++ Standards wurden aber auch die Begriffe standardisiert und damit ist Klassendeklaration in diesem Zusammenhang schlicht falsch.