2010-12-13 7 views
3

Von meinem Verständnis von Erklärungen und Definitionen, auf globalen Rahmen:Wie mache ich definieren und deklarieren eine Variable mit dem Standardkonstruktor in C++?

MyClass instance();//Declares a function that returns a MyClass 
MyClass instance;//Declares an instance of MyClass 

Ist es möglich, eine Variable zu deklarieren und definieren den Standard-Konstruktor im globalen Bereich zu benutzen? Was wäre, wenn ich statt einer Klasse eine Struktur verwende?

EDIT:

Okay, so tut MyClass instance; den Standard-Konstruktor aufrufen. Kann mir jemand erklären, wie dies mit this example konsistent ist:

int a; // not default constructed, will have random data 
int b = int(); // will be initialised to zero 

Antwort

6
MyClass instance; 

den Standardkonstruktor aufrufen (das heißt der Konstruktor ohne Parameter).

Dies ist kontraintuitiv, weil eine überladene Konstruktor mit Parametern aufzurufen, würden Sie wie folgt vorgehen:

MyClass instance(param1, param2); 

Logic würden Sie sagen, dass Sie in einer leeren Argumentliste übergeben Sie den Standard-Konstruktor aufzurufen, aber Mit dem folgenden Code ...

MyClass instance(); 

... sieht aus wie ein Prototyp für den Compiler, anstatt den Bau eines MyClass Objekt.

Es gibt keinen Unterschied zwischen einem struct und einem class in C++, mit der Ausnahme, dass ein struct hat public Mitglieder der Standardeinstellung und ein class hat private Mitglieder standardmäßig.

+0

Warum verhält sich das anders als "i" nt' funktioniert (siehe Bearbeiten oben)? – Casebash

+0

@Casebash - 'int' ist ein POD-Typ, der je nach Deklaration entweder initialisiert oder nicht initialisiert wird. Wenn Sie ein 'int' lokal auf dem Stack deklarieren und es nicht explizit initialisieren, wird es zufällige Daten haben, wie Sie angegeben haben. Weitere Informationen finden Sie in dieser Antwort: http: // stackoverflow.com/questions/3102096/when-do-c-pod-types-get-zero-initialisiert/3102134 # 3102134 – LeopardSkinPillBoxHat

+0

Angenommen, "MyStruct" ist definiert als "struct MyStruct {int a;};". Die Antwort, die Sie verknüpft haben, scheint zu implizieren, dass "MyStruct" nicht standardmäßig initialisiert wird, wenn es im lokalen Gültigkeitsbereich deklariert ist (es besagt, dass myInstance.a nicht definiert ist). Der Standardkonstruktor für eine Struktur ruft die Standardkonstruktoren für jedes Element in der Struktur auf, oder? – Casebash

1
MyClass instance; 

ist auch eine Definition, die den Standardkonstruktor verwendet. Wenn Sie es nur deklarieren möchten, müssen Sie

extern MyClass instance; 

, die keine Definition ist. Beide haben jedoch eine externe Verbindung.

2
  1. Es spielt keine Rolle, ob Sie auf globaler Ebene sind oder nicht.
  2. MyClass instance; ist eine Definition (der Standard-Konstruktor, nicht nur eine Erklärung. Nur eine Erklärung zu erhalten (zB in einer Header-Datei), würden Sie extern MyClass instance; verwenden.
  3. Es spielt keine Rolle, für diesen Teil, ob MyClass ist eine Klasse oder eine Struktur. die nur Sache, die zwischen structs und Klassen in C++ ist die Standard-Interpretation, ob die Mitglieder und Basen sind öffentliche oder private ändert.
  4. Wenn Sie explizit sein möchten, können Sie MyClass instance = MyClass(); schreiben.