Was ist Objekt * foo (bar) tun?
Frage
Für einige Klassen C:
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
Lösung
C * b (a) und C * b = a sind äquivalent. Wie bei vielen anderen Sprachen, es gibt mehr als einen Weg, es zu tun ...
Andere Tipps
Beachten Sie, dass in
C* a = new C();
C* b(a);
b ist ein Zeiger auf ein Objekt C den gleichen Wert wie A zugeordnet. Allerdings
#include "somefile.h"
C* b(a);
Wir könnten genauso gut b als Funktion werden definiert, die ein Objekt vom Typ a annimmt, und gibt einen Zeiger auf C.
Die Norm beschreibt die verschiedenen Arten der Initialisierung ist 8,5, und diese beiden speziell unter 8,5 / 12.
C* b(a); //what does it do?
Das nennt man direkte Initialisierung . Wenn ‚B‘ Klassentyp hatte, dann würde der Compiler Überladungsauflösung auf die Konstruktoren in C durchführen ‚a‘ als ein Argument verwendet wird. Für einen Zeigertyp, initialisiert es einfach 'b' mit 'a'.
C* b = a; //is there a difference?
Der Standard diese nicht berücksichtigt in einigen Fällen anders sein, die obige Syntax genannt wird Kopie Initialisierung . Wie für die direkte Initialisierung als ‚b‘ ist kein Klassentyp ist, dann wird es mit dem Wert von ‚a‘ initialisiert. Wenn 'a' und 'b' den gleichen Klassentyp ist, dann direkte Initialisierung verwendet wird.
Wo ‚b‘ ist ein Klassentyp und ‚a‘ hat eine andere Art (Klasse oder nicht), dann ist die Regeln etwas anders (8,5 / 14-b1.b3). Also für den folgenden Code:
C b = a;
Zum einen wird versucht, ‚a‘ umwandeln ‚C‘ zu geben und dann wird dieses temporäre Objekt verwendet zu initialisieren ‚b‘. Dies ist bedeutsam, da Sie eine Situation haben können, wo direkte Initialisierung gelingt es aber Kopie Initialisierung fehlschlägt:
class A {
public:
operator int ();
};
class B {
public:
B (int);
};
void foo ()
{
A a;
B b1 (a); // Succeeds
B b2 = a; // Fails
}
- C * a = new C (); Nun ist es die Schaffung eines Zeigers
Typ C, die ebenfalls neu zuteilen
Speicher durch Schlüsselwort new ....
- Anweisung Es folgt, hängt von Konstruktor Logik . C * b (a); // was tut sie?
- Ihre erste und dritte Aussage ist Äquivalent. C * b = a; //Gibt es eine Unterschied?
Die erste erstellt eine neue Instanz von C und setzt seine Adresse in a.
Das zweite ist ein Zeiger zu Funktionsdeklaration. Dieser Zeiger kann auf jeden Funktionspunkt ein Argument des Typs A und gibt einen Zeiger auf ein Objekt vom Typ C nehmen.
Die dritte erklärt, b, einen Zeiger auf ein Objekt vom Typ C und initialisiert es mit a.