Frage

Für einige Klassen C:

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?
War es hilfreich?

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
}
  1. C * a = new C (); Nun ist es die Schaffung eines Zeigers Typ C, die ebenfalls neu zuteilen Speicher durch Schlüsselwort new ....
  2. Anweisung Es folgt, hängt von Konstruktor Logik . C * b (a); // was tut sie?
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top