Pregunta

desde que he venido desde C # para C ++ todo parece una locura para mí en C ++. Me preguntaba si alguien me podría explicar por qué tenemos este tipo de instanciar en C ++: método 1:

ClassA obj1; // this is going to stack

Método 2:

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

mientras que nosotros no tenemos la creación de instancias comunes en C # forma en C ++:

ClassA  obj2 = new obj2();

y una pregunta más en metodo1 consigo una instancia de la claseA pero sin el () y este es el lugar exacto del que hemos se confundió, ¿por qué tenemos que instatiating así? nuestra claseA tiene un constructor de instancias, pero sin paréntesis ???  ¿cómo es que llamar a su constructor?

p.s: He leído estos temas:

diferentes métodos para crear instancias de un objeto en C ++

Stack, estático, y Heap en C ++

Qué y dónde están la pila y el montón?

¿Fue útil?

Solución

De hecho mover a C ++ de un lenguaje como Java o C # puede ser desalentador, he pasado por él también.

La primera y principal diferencia es que en C ++ que casi siempre manejar su propia memoria. Al crear un objeto en el montón usted es responsable de eliminarlo por lo que no hay fugas de memoria - esto a su vez significa que se puede eliminar cuando le parezca. Al crear un objeto en la pila, se elimina automáticamente cuando se sale del ámbito -. Hay que tener cuidado de no usar después de que se sale del ámbito

Ejemplo:

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!)

frente

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

Dicho esto, los dos métodos también son significativamente diferentes en un aspecto: la primera crea un objeto. El segundo crea un puntero a un objeto. Lo bueno de tener punteros es que se pueden pasar alrededor como parámetros con memoria de sólo el mínimo que se copia en la pila (el puntero se copia, en lugar de la totalidad del objeto). Por supuesto, siempre se puede obtener la dirección de un objeto asignado en la pila mediante el uso de "Y", o pasa a su alrededor como una referencia - sin embargo, al usar objetos asignados en la pila que tanto tener especial cuidado con su alcance

He encontrado este sitio web un gran recurso cuando me mudé de Java a C ++: http : //www.parashift.com/c++-faq-lite/ - que probablemente encontrará también, que ofrece una gran cantidad de buenas explicaciones

Otros consejos

En C ++, usted tiene que decidir dónde quiere que su objeto de residir. Por donde quiero decir en el que la memoria, la pila, o el montón.

instanciar un objeto es un proceso de dos pasos. Lo primero que necesita la memoria, y, o bien se toma en la pila, o le sitúa entre el montón. En segundo lugar, se inicializa la memoria con los valores que desee, es decir, que la construcción del objeto, llamando a su función constructora.

Estos dos sintaxis son para estos dos posibles diferentes posiciones de la memoria:. La pila, y el montón

En cuanto a la sintaxis y el paréntesis parecer que falta para el objeto pila asignado, es para eliminar la ambigüedad entre la definición y construcción de un objeto, y la declaración de una función. De hecho, ClassA obj(); declara una función de tomar ningún parámetro, y devolver un objeto ClassA.

sintaxis de C ++ es exactamente igual. Si desea utilizar el constructor por defecto, que acaba de llamar de esa manera:

ClassA obj1;

Si desea tener un constructor con un parámetro, que podríamos llamar de esta manera:

ClassA obj1(5);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top