2013-03-09 14 views
10

Zuerst bin ich von JAVA.Erstellen eines Klassenobjekts in C++

In Java erstellen wir Klassenobjekt wie folgt.

Die Beispielklasse kann einen Konstruktor haben oder keinen Konstruktor haben.

kann ich das gleiche in C++ verwenden, wie diese

Example* example=new Example(); 

Wo Konstruktor obligatorisch ist.

Aus diesem Tutorial http://www.cplusplus.com/doc/tutorial/classes/

Ich habe, dass wir Objekt wie folgt erstellen können.

Example example; 

Welche benötigen keinen Konstruktor.

Ich habe zwei Fragen.

1) Was ist der Unterschied zwischen den beiden Methoden zum Erstellen von Klassenobjekten?

2) Wenn ich Objekt wie Example example; erstellen, wie man das in einer Singleton-Klasse verwendet.

wie ich normalerweise so.

Sample* Singleton::get_sample() { 
    if (sample == NULL) { 
     sample = new Sample(); 
    } 
    return sample; 
} 

Bitte führen Sie mich, wenn ich falsch liege.

Antwort

10

ich das gleiche in C++ verwenden können, wie diese [...] Wo Konstruktor obligatorisch ist. Von this tutorial Ich habe, dass wir so ein Objekt erstellen können [...] die keinen Konstruktor benötigen.

Das ist falsch. Ein Konstruktor muss vorhanden sein, um ein Objekt zu erstellen. Der Konstruktor könnte implizit vom Compiler unter bestimmten Bedingungen definiert werden, wenn Sie keine angeben, aber eventuell muss der Konstruktor vorhanden sein, wenn ein Objekt instanziiert werden soll. Tatsächlich ist die Lebensdauer eines Objekts so definiert, dass es beginnt, wenn die Konstruktorroutine zurückkehrt.

Von Ziffer 3.8/1 des C++ 11 Standard:

[...] Die Lebensdauer eines Objekt vom Typ T beginnt, wenn:

- Speicher mit der richtigen Ausrichtung und Größe für Typ T erhalten, und

- Wenn das Objekt nicht-triviale Initialisierung hat, ist seine Initialisierung abgeschlossen.

Daher muss ein Konstruktor vorhanden sein.

1) Was ist der Unterschied zwischen beiden Arten der Erstellung von Klassenobjekten?

Wenn Sie instanziiert Objekt mit automatischer Speicherdauer, wie folgt aus (wo X etwas Klasse ist):

X x; 

Sie ein Objekt erstellen, die automatisch zerstört wird, wenn es den Gültigkeitsbereich verlässt. Auf der anderen Seite, wenn Sie das tun:

X* x = new X(); 

Sie erstellen ein Objekt dynamisch und Sie binden ihre Adresse in einen Zeiger.Auf diese Weise wird das von Ihnen erstellte Objekt nicht zerstört, wenn Ihr Zeiger x den Gültigkeitsbereich verlässt.

in der modernen C++, wird dies als eine zweifelhafte Programmierpraxis angesehen: obwohl Zeiger sind wichtig, weil sie reference semantics, roh Zeiger sind schlecht zu realisieren erlauben, weil sie in Speicherlecks (Objekte outliving alle ihre Zeiger und führen niemals zerstört werden) oder in ungeeigneten Zeigern (Zeiger, die das Objekt, auf das sie zeigen, überlebten und bei der Dereferenzierung möglicherweise Undefined Behavior verursachen).

In der Tat, wenn ein Objekt mit new Erstellen Sie immer müssen bedenken, es mit delete zu zerstören:

delete x; 

Wenn Sie Referenzsemantik benötigen und sind gezwungen, Zeiger zu verwenden, in C++ 11

std::shared_ptr<X> x = std::make_shared<X>(); 

intelligente Zeiger kümmern Speicher-Management-Themen, die wh ist: Sie sollten mit Smart Pointer stattdessen betrachten gibt dir Kopfschmerzen mit rohen Zeigern. Intelligente Zeiger sind in der Tat fast das gleiche wie Java oder C# Objektreferenzen. Das "fast" ist notwendig, da der Programmierer darauf achten muss, keine zyklischen Abhängigkeiten durch das Vorhandensein von Smartpointern einzuführen.

2) Wenn ich Objekt wie Beispiel Beispiel erstelle; wie man das in einer Singleton-Klasse benutzt.

Sie könnten so etwas wie dieser (vereinfachte Code) tun:

struct Example 
{ 
    static Example& instance() 
    { 
     static Example example; 
     return example; 
    } 

private: 

    Example() { } 
    Example(Example const&) = delete; 
    Example(Example&&) = delete; 
    Example& operator = (Example const&) = delete; 
    Example& operator = (Example&&) = delete; 

}; 
+0

Es kann angemerkt werden, dass der leere Konstruktor aufgerufen wird, auch wenn der Ausdruck ohne Klammern ist. – jiggunjer

2

1) Was ist der Unterschied zwischen beiden Arten der Erstellung von Objekten der Klasse ?

Zuerst ist ein Zeiger auf ein konstruiertes Objekt in Heap (von new). Zweite ist ein Objekt, das implizit konstruiert wird. (Standardkonstruktor)

2) Wenn ich Objekt wie Beispiel Beispiel erstelle; wie man das in einer Singleton Klasse benutzt.

Es auf Ihre Ziele abhängig ist, wird am einfachsten einfach als Mitglied in der Klasse setzen.

Eine Probe eines Singletonklasse, die ein Objekt von Example Klasse:

class Sample 
{ 

    Example example; 

public: 

    static inline Sample *getInstance() 
    { 
     if (!uniqeInstance) 
     { 
      uniqeInstance = new Sample; 
     } 
     return uniqeInstance; 
    } 
private: 
    Sample(); 
    virtual ~Sample(); 
    Sample(const Sample&); 
    Sample &operator=(const Sample &); 
    static Sample *uniqeInstance; 
}; 
1
Example example; 

Hier Beispiel ist ein Objekt auf dem Stapel.

Example* example; 
.... 
example=new Example(); 

die eine variable Beispiel erste Anweisung erstellt Hier, das ein "Zeiger auf Example" ist:

Example* example=new Example(); 

Dies könnte in gebrochen werden. Wenn der Konstruktor aufgerufen wird, wird ihm auf dem Heap Speicher zugewiesen (dynamische Zuweisung).Es liegt in der Verantwortung des Programmierers, diesen Speicher freizugeben, wenn er nicht mehr benötigt wird. (C++ hat keine Garbage Collection wie Java).

1

Im ersten Fall erstellen Sie das Objekt auf der heap mit new. Im zweiten Fall erstellen Sie das Objekt auf der stack, so dass es entsorgt wird, wenn es außerhalb des Geltungsbereichs ist. In C++ müssen Sie Objekte auf der heap explizit mit delete löschen, wenn Sie sie nicht mehr benötigen.

Um eine statische Methode aus einer Klasse aufrufen, tun

Singleton* singleton = Singleton::get_sample(); 

in Ihrer Haupt-Funktion oder wo auch immer.

1

1) Was ist der Unterschied zwischen beiden Arten der Erstellung von Klassenobjekten?

a) Zeiger

Example* example=new Example(); 
// you get a pointer, and when you finish it use, you have to delete it: 

delete example; 

b) Einfache Erklärung

Example example; 

Sie eine Variable erhalten, keinen Zeiger, und es wird der Gültigkeitsbereich zerstört wurde erklärt.

2) Singleton C++

This SO question Mai hilft Ihnen

8
Example example; 

Dies ist eine Deklaration einer Variablen example vom Typ namens Example. Dadurch wird das Objekt standardmäßig initialisiert, was den Aufruf des Standardkonstruktors zur Folge hat. Das Objekt wird eine automatische Speicherdauer haben, was bedeutet, dass es zerstört wird, wenn es den Gültigkeitsbereich verlässt.

Example* example; 

Dies ist eine Erklärung einer Variablen example benannt, die ein Zeiger ist auf ein Example. In diesem Fall wird die Initialisierung nicht initialisiert - der Zeiger zeigt nirgends auf eine bestimmte Stelle. Es gibt kein Example Objekt hier. Das Zeigerobjekt hat eine automatische Speicherdauer.

Example* example = new Example(); 

Dies ist eine Erklärung einer Variablen example benannt, die ein Zeiger ist auf ein Example. Dieses Zeigerobjekt hat wie oben eine automatische Speicherdauer. Es wird dann mit dem Ergebnis new Example(); initialisiert. Dieser new Ausdruck erstellt ein Example Objekt mit dynamischer Speicherdauer und gibt dann einen Zeiger darauf zurück. Der Zeiger example zeigt nun auf das dynamisch zugewiesene Objekt. Das Objekt ist Example Wert initialisiert, der eine vom Benutzer bereitgestellte Konstruktor aufgerufen wird, wenn es einen gibt oder nicht alle Mitglieder initialisieren 0.

Example* example = new Example; 

Dies ist ähnlich zu der vorherigen Zeile. Der Unterschied besteht darin, dass das Example-Objekt standardmäßig initialisiert ist und den Standardkonstruktor Example aufruft (oder es nicht initialisiert, wenn es nicht vom Klassentyp ist).

Ein dynamisch zugewiesenes Objekt muss delete d sein (wahrscheinlich mit delete example;).

2

Zuerst ruft beide Fälle einen Konstruktor auf. Wenn Sie

schreiben
Example *example = new Example(); 

dann sind Sie ein Objekt erstellen, rufen Sie den Konstruktor und abrufen einen Zeiger darauf.

Wenn Sie

Example example; 

Der einzige Unterschied zu schreiben ist, dass Sie das Objekt und nicht ein Zeiger auf sie bekommen. Der Konstruktor, der in diesem Fall aufgerufen wird, ist derselbe wie oben, der Standardkonstruktor (kein Argument).

Was die Singleton Frage, müssen Sie Ihre statische Methode durch Schreiben einfach aufrufen:

Example *e = Singleton::getExample(); 
0

Es gibt zwei Möglichkeiten zu Objekt in c zu machen/erstellen ++.

Erste ist:

MyClass myclass; // if you don;t need to call rather than default constructor  
MyClass myclass(12); // if you need to call constructor with parameters 

zweite ist:

MyClass *myclass = new MyClass();// if you don;t need to call rather than default constructor 
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters 

in C++, wenn Sie neues Schlüsselwort verwenden, wird Objekt im Heap gespeichert werden. Es ist sehr nützlich, wenn Sie dieses Objekt lange Zeitperiode verwenden und wenn Sie die erste Methode verwenden, wird es im Stapel gespeichert. es kann nur kurze Zeit verwendet werden. Hinweis: Wenn Sie ein neues Schlüsselwort verwenden, denken Sie daran, dass es den Zeigerwert zurückgibt. Sie sollten den Namen mit * angeben. Wenn Sie die zweite Methode verwenden, wird das Objekt im Heap nicht gelöscht. Sie müssen selbst löschen, indem Sie das Schlüsselwort löschen verwenden.

delete myclass; 
Verwandte Themen