Domanda

Per alcune classi C:

C* a = new C();

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

C* b = a;  //is there a difference?
È stato utile?

Soluzione

C * b (a) e C * b = a sono equivalenti. Come in molte lingue, esiste più di un modo per farlo ...

Altri suggerimenti

Nota che in

C* a = new C();
C* b(a);  

b è un puntatore a un oggetto C assegnato allo stesso valore di a. Tuttavia,

#include "somefile.h"
C* b(a);  

potremmo facilmente definire b come una funzione che accetta un oggetto di tipo a e restituisce un puntatore a C.

Lo standard descrive i diversi tipi di inizializzazione è 8.5, e questi due specificatamente in 8.5 / 12.

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

Questo si chiama inizializzazione diretta . Se 'b' avesse un tipo di classe, il compilatore avrebbe eseguito la risoluzione di sovraccarico sui costruttori in C usando 'a' come argomento. Per un tipo di puntatore, inizializza semplicemente "b" con "a".

C* b = a;  //is there a difference?

Lo standard li considera diversi in alcuni casi, la sintassi sopra è chiamata inizializzazione copia . Per quanto riguarda l'inizializzazione diretta come 'b' non è un tipo di classe, viene inizializzato con il valore di 'a'. Se 'a' e 'b' sono dello stesso tipo di classe, viene utilizzato inizializzazione diretta .

Dove 'b' è un tipo di classe e 'a' ha un tipo diverso (classe o no), le regole sono leggermente diverse (8.5 / 14-b1.b3). Quindi per il seguente codice:

C b = a;

In primo luogo, viene effettuato un tentativo di convertire "a" nel tipo "C", quindi questo oggetto temporaneo viene utilizzato per inizializzare "b". Ciò è significativo in quanto si può verificare una situazione in cui inizializzazione diretta ha esito positivo ma copia inizializzazione non riuscita:

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 (); Ora sta creando un puntatore di tipo C, che alloca anche nuovo memoria utilizzando la nuova parola chiave ....
  2. La seguente dichiarazione dipende da la tua logica del costruttore . C * b (a); // cosa fa?
  3. La tua prima e terza affermazione sono equivalente. C * b = a; //C'è un differenza?

Il primo crea una nuova istanza di C e inserisce il suo indirizzo in a.

La seconda è una dichiarazione da puntatore a funzione. Questo puntatore può puntare a qualsiasi funzione che accetta un argomento di tipo a e restituisce un puntatore a un oggetto di tipo C.

Il terzo dichiara b, un puntatore a un oggetto di tipo C e lo inizializza con a.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top