Domanda

da quando sono venuto da c # per C ++ tutto sembra pazzesco per me in C ++. Mi chiedo solo se qualcuno potrebbe spiegare a me perché dobbiamo questo tipo di istanziare in C ++: Metodo 1:

ClassA obj1; // this is going to stack

Metodo 2:

ClassA *obj1 = new ClassA(); //this is going to heap

mentre noi non abbiamo il creare un'istanza comune in C # modo in C ++:

ClassA  obj2 = new obj2();

e ancora una domanda in Method1 ottengo un'istanza dal ClassA ma senza la () e questo è il luogo esatto della'VE un po 'confusa, perché dobbiamo instatiating del genere? il nostro ClasseA ha un costruttore, ma un'istanza senza parentesi ???  come mai noi chiamiamo il suo costruttore?

P.S: Ho letto questi argomenti:

metodi differenti per istanziare un oggetto in C ++

Catasta, statico e Heap in C ++

Quali e dove sono lo stack e heap?

È stato utile?

Soluzione

In effetti trasferirsi in C ++ da un linguaggio come Java o C # può essere scoraggiante, ho passato attraverso di essa come bene.

La prima e più importante differenza è che in C ++ si riesce quasi sempre la propria memoria. Quando si crea un oggetto sul mucchio sei responsabile per eliminarlo in modo da non perdere la memoria - questo a sua volta significa che è possibile eliminarlo quando si vede in forma. Quando si crea un oggetto in pila, viene eliminato automaticamente quando va fuori di portata -. È necessario fare attenzione a non usarlo dopo che esce dallo scope

Esempio:

void do_queue(B& queue)
{
    Evt *e = new Evt;
    queue.queueEvent(e); 
} // all well, e can be popped and used (also must be deleted by someone else!)

vs

void do_queue(B& queue)
{
    Evt e;
    queue.queueEvent(&e); 
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg

Detto questo, i due metodi sono significativamente differenti in un aspetto: il primo crea un oggetto. Il secondo crea un puntatore ad un oggetto. La cosa bella di avere puntatori è che è possibile passare in giro come parametri con la memoria solo il minimo viene copiato sullo stack (il puntatore viene copiato, anziché l'intero oggetto). Naturalmente, si può sempre ottenere l'indirizzo di un oggetto allocato sullo stack utilizzando "&", o passare intorno come riferimento - tuttavia, quando si usano oggetti allocati sullo stack molto di prestare particolare attenzione con la loro portata

Ho trovato questo sito una grande risorsa quando mi sono trasferita da Java a C ++: http : //www.parashift.com/c++-faq-lite/ - si rischia di trovare troppo, offre un sacco di buone spiegazioni

Altri suggerimenti

In C ++, si deve decidere dove volete che il vostro oggetto a risiedere. Con cui intendo in cui la memoria, lo stack o heap.

istanza di un oggetto è un processo in due fasi. Prima di tutto bisogna memoria e uno si prende in pila, o di allocare dal mucchio. In secondo luogo, si inizializza la memoria con i valori desiderati, vale a dire si costruisce l'oggetto, richiamando la sua funzione di costruzione.

Questi due sintassi sono per questi due possibili diverse locazioni di memoria:. La pila, e il cumulo

Per quanto riguarda la sintassi e la parentesi apparentemente mancante per l'oggetto pila allocato, è di disambiguare tra la definizione e la costruzione di un oggetto, e la dichiarazione di una funzione. Infatti, ClassA obj(); dichiara una funzione di prendere nessun parametro, e restituisce un oggetto ClassA.

sintassi C ++ è proprio così. Se si desidera utilizzare il costruttore di default, basta chiamare in quel modo:

ClassA obj1;

Se si desidera avere un costruttore con un parametro, si dovrebbe chiamare in questo modo:

ClassA obj1(5);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top