Domanda
Per alcune classi C:
C* a = new C();
C* b(a); //what does it do?
C* b = a; //is there a difference?
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
}
- C * a = new C (); Ora sta creando un puntatore di
tipo C, che alloca anche nuovo
memoria utilizzando la nuova parola chiave ....
- La seguente dichiarazione dipende da la tua logica del costruttore . C * b (a); // cosa fa?
- 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.