Inizializzazione classe C ++

6

Sono un programmatore Python che vede molto codice C ++ ma non conosce la lingua e sembrano esserci due modi per inizializzare una classe. Speravo che qualcuno potesse dirmi la differenza.

class Point {
        int x, y;
     public:
        int get_x();
        int get_y();
        Point(int, int);
}

// ok we are going to leave the methods and constructors unimplemented for brevity
// now here's the part that puzzles me
Point p(5, 5); // ..or
Point p = new Point(5, 5);

Qual è la diffrenza tra i due?

    
posta Christopher 19.07.2012 - 22:09
fonte

2 risposte

20

Una di queste variabili vive nello stack, l'altra nello heap. La sintassi corretta è questa:

Point p(5, 5); 
Point* p = new Point(5, 5);

Il primo crea un oggetto sullo stack. Quando p esce dal campo di applicazione, verrà rimosso automaticamente. Il secondo, crea un oggetto punto sull'heap. Fino a quando non lo rimuovi manualmente, rimarrà in memoria.

Nel secondo caso, p è un puntatore all'oggetto Point, mentre nel primo caso p è l'oggetto punto.

Python essenzialmente fa solo la seconda versione e non esegue la prima. Python è garbage collection, quindi rimuoverà anche l'oggetto point dalla memoria se non è più referenziato.

Tuttavia, dovrei menzionare (vedi commenti) che il metodo preferito per creare oggetti nell'heap è usare puntatori intelligenti. Vedi la risposta di DeadMG per ulteriori dettagli.

    
risposta data 19.07.2012 - 22:16
fonte
-3
Point p(5, 5); // ..or

Crea una variabile automatica "in pila". Ciò significa che è una durata e la memoria è fissa al suo ambito.

Point* p = new Point(5, 5);

Crea una perdita di memoria, doppia eliminazione o danneggiamento dell'heap nel programma. Ciò significa che quasi sicuramente il programma si bloccherà, causando la corruzione dei dati dell'utente o altri effetti collaterali divertenti . Ecco perché gli attuali programmatori C ++ usano alternative, come ...

auto p = make_unique<Point>(5, 5);

Crea un punto "sull'heap". In questo caso, è la durata e la memoria è fissa per la vita del proprietario unique_ptr<Point> . Questa proprietà può essere trasferita spostando la semantica. Sfortunatamente, make_unique non viene fornito come Standard (un difetto noto), ma è relativamente facile eseguire il rollover. È una semplice funzione di fabbrica.

auto p = std::make_shared<Point>(5, 5);

Crea anche un Punto "sull'heap". In questo caso, è la durata e la memoria è fissa per la durata di ogni shared_ptr<Point> che punta ad esso. Quando sono tutti distrutti, Point verrà ripulito. shared_ptr<Point> può essere copiato, a differenza di unique_ptr<Point> . Questo è molto simile al comportamento di Python. Tuttavia, non dimenticare che, diversamente da Python, non ci saranno macchinari per interrompere i cicli di riferimento.

    
risposta data 19.07.2012 - 22:19
fonte

Leggi altre domande sui tag