c++ - objetos - que es una clase y un objeto
¿Cuál es la diferencia entre crear una instancia de un objeto utilizando nuevo vs. sin (9)
En C ++,
Además de la asignación de memoria dinámica, ¿existe alguna diferencia funcional entre las siguientes dos líneas de código?
Time t (12, 0, 0); //t is a Time object
Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
Asumo, por supuesto, que se ha definido un Time (int, int, int) ctor. También me doy cuenta de que en el segundo caso, será necesario eliminarlo ya que fue asignado en el montón. ¿Hay alguna otra diferencia?
Creo que ya entiendes todas las diferencias. Asumiendo que usted es consciente de la diferencia de sintaxis para acceder a un miembro de t a través de un puntero y una variable (bueno, el puntero también es una variable, pero supongo que comprende lo que quiero decir). Y suponiendo también que conoce la diferencia de llamada por valor y llama por referencia cuando pasa t a una función. Y creo que también entiendes lo que sucederá si asignas t a otra variable y realizas el cambio a través de esa otra variable. El resultado será diferente dependiendo de si t es puntero o no.
En lo que respecta al constructor, las dos formas son funcionalmente idénticas: simplemente provocarán que se llame al constructor sobre una instancia de objeto recientemente asignada. Ya parece tener una buena comprensión de las diferencias en términos de modos de asignación y duración de los objetos.
La línea:
Time t (12, 0, 0);
... asigna una variable de tipo Time
en ámbito local, generalmente en la pila, que se destruirá cuando finalice su alcance.
Por el contrario:
Time* t = new Time(12, 0, 0);
... asigna un bloque de memoria llamando a cualquiera de ::operator new()
o Time::operator new()
, y posteriormente llama a Time::Time()
con this
configurado a una dirección dentro de ese bloque de memoria (y también devuelto como el resultado de new
), que luego se almacena en t
. Como usted sabe, esto generalmente se realiza en el montón (de forma predeterminada) y requiere que lo delete
más adelante en el programa, mientras que el puntero en t
generalmente se almacena en la pila.
No existe una diferencia funcional para el objeto entre asignarlo en la pila y asignarlo en el montón. Ambos invocarán el constructor del objeto.
Por cierto, te recomiendo que uses boost''s shared_ptr o scoped_ptr, que también es funcionalmente equivalente cuando se asigna en el heap (con la utilidad adicional de scoped_ptr que te impide copiar los punteros que no se pueden copiar):
scoped_ptr<Time> t(new Time(12, 0, 0));
No hay otra diferencia con lo que ya sabes.
Suponiendo que su código está utilizando el servicio del operador predeterminado nuevo.
Otra diferencia obvia es cuando se accede a las variables y métodos de t.
Time t (12, 0, 0);
t.GetTime();
Time* t = new Time(12, 0, 0);
t->GetTime();
No .. No hay otra diferencia ...
void foo (Time t)
{
t = Time(12, 0, 0);
}
void bar (Time* t)
{
t = new Time(12, 0, 0);
}
int main(int argc, char *argv[])
{
Time t;
foo(t);//t is not (12,0,0),its value depends on your defined type Time''s default constructor.
bar(&t);//t is (12,0,0)
return 0;
}
- Use new: Llame al operador nueva función para obtener memoria dinámica, y luego para llamar a la función constuctor.
- No usar nuevo: no llamará al operador nueva función, solo directamente para llamar a la función constuctor. La pila se usará directamente, sin uso para malloc.