Solo una simple pregunta. Como sugiere el título, solo he usado el operador "nuevo" para crear nuevas instancias de una clase, por lo que me preguntaba cuál era el otro método y cómo usarlo correctamente.crear una nueva instancia de una clase sin operador "nuevo"
Respuesta
Usted también puede tener automáticas instancias de la clase, que no utiliza new
, como:
class A{};
//automatic
A a;
//using new
A *pA = new A();
//using malloc and placement-new
A *pA = (A*)malloc(sizeof(A));
pA = new (pA) A();
//using ONLY placement-new
char memory[sizeof(A)];
A *pA = new (memory) A();
Los dos últimos están usando placement-new que es ligeramente diferente de solo nuevo. placement-new se usa para construir el objeto llamando al constructor. En el tercer ejemplo, malloc
solo asigna la memoria, no llama al constructor, es por eso que placement-new se usa para llamar al constructor para construir el objeto.
También tenga en cuenta cómo eliminar la memoria.
//when pA is created using new
delete pA;
//when pA is allocated memory using malloc, and constructed using placement-new
pA->~A(); //call the destructor first
free(pA); //then free the memory
//when pA constructed using placement-new, and no malloc or new!
pA->~A(); //just call the destructor, that's it!
saber lo que es la colocación de nuevo, leer estas preguntas frecuentes:
- What is "placement new" and why would I use it? (FAQ) en parashift.com
- placement new (FAQ) en stackoverflow.com
justo Usted puede declarar una variable normal:
YourClass foo;
Suponiendo que tiene un constructor predeterminado. – Nick
¿Dónde puedo encontrar más información sobre una "variable normal"? –
La mayoría de los objetos en C++ no deberían crearse utilizando los nuevos. En su lugar, se debe crear en la misma forma que lo haría crear números enteros o booleanos:
class Person {
...
};
int main() {
int x = 3;
boolean b = true;
Person p("fred");
}
Creación de objetos con nueva debe reservarse para las ocasiones en las que necesita el polimorfismo, o posiblemente cuando se necesita para crear una serie de objetos , pero no sabe cuántos en tiempo de compilación.
No, la decisión sobre cómo crear un objeto depende de cuánto tiempo se supone que debe vivir el objeto. Si existe solo dentro del alcance y la duración de una función dada, entonces tiene sentido convertirla en una variable local 'auto'. Si debe existir más allá de la ejecución de la función, debe asignarse dinámicamente. También está la cuestión de cuántos objetos se crean, es decir, tener una lista o una matriz de ellos en lugar de una sola instancia. –
No, en absoluto: puedo crear una instancia en una función y devolverla a una función de llamada copiando, como lo haría para una instancia de un entero. ¿De todas las funciones que escribe que devuelven std :: cadenas las devuelven a través de punteros? –
Parece que realmente te gusta copiar objetos ... –
El uso de malloc le dará el mismo resultado que el nuevo, simplemente sin llamar al constructor.
No completamente erróneo, entonces no -1 ... Esto es algo correcto solo si el constructor no hace nada y la clase no tiene ningún método virtual ... –
Cualquiera de las formas habituales: como una variable local o estática, o como una temporal. En general, las únicas veces que usa new
en C++ es cuando el objeto tiene identidad y una duración que no corresponde a corresponde a un ámbito, o cuando es polimórfico. (Hay excepciones de , por supuesto, pero no muchas.) Si el objeto puede ser copiado, generalmente es preferible usar instancias locales, copiando según sea necesario. (Al igual que lo haría para int
, de hecho.)
- 1. ¿Cómo puedo crear una nueva instancia de clase de una clase dentro de una clase (estática)?
- 2. sobrecarga de crear una nueva clase
- 3. Python: crear una instancia de clase sin invocar el inicializador
- 4. ¿Debo crear una nueva instancia de delegado?
- 5. ¿Puedo crear una nueva instancia de mi clase de objeto administrado personalizado sin pasar por NSEntityDescription?
- 6. Operador sobrecarga nuevo para una clase
- 7. Crear una instancia de clase con o sin paréntesis?
- 8. C#: Creando una instancia de una clase abstracta sin definir la nueva clase
- 9. weka.core.UnassignedDatasetException al crear una instancia sin etiqueta
- 10. crear instancia de clase dinámica
- 11. Cómo crear una nueva instancia de clonación del objeto PSObject
- 12. Métodos de anulación de Java al crear una nueva instancia de una clase
- 13. startActivity crear una nueva instancia de Activity cada vez
- 14. ¿Cómo crear una clase simulada con operador []?
- 15. Crear instancia de clase derivada de una instancia de clase base sin conocer los miembros de la clase
- 16. ¿Se garantiza NumberFormat.getInstance para crear una nueva instancia?
- 17. ¿Por qué hacer DUP al crear una nueva instancia?
- 18. Java cómo crear una instancia de una clase de cadena
- 19. ¿Existe un call_user_func() equivalente para crear una nueva instancia de clase?
- 20. crear una nueva instancia de un tipo dado como parámetro
- 21. Crear una instancia de una clase python en C#
- 22. cómo crear dinámicamente una instancia de una clase en python?
- 23. Creando una nueva instancia desde Clase con el parámetro constructor
- 24. Cómo copiar/crear una instancia de clase derivada desde un puntero a una clase base polimórfica?
- 25. una instancia de una nueva clase del nombre de una variable en un espacio de nombres
- 26. Volver a la pantalla anterior sin crear nueva instancia
- 27. Cómo crear una instancia nueva a partir de un objeto de clase en Python
- 28. ¿Usar la reflexión en Java para crear una nueva instancia con el tipo de variable de referencia establecido en el nuevo nombre de clase de instancia?
- 29. Agregar una nueva instancia en weka
- 30. ¿Puede una clase python devolver una nueva instancia de su clase?
+1: Me preguntaba cuál era el término correcto para * no asignado dinámicamente *. * automático * - ¡Gracias! –
Además, para apreciar las ventajas de utilizar instancias automáticas, necesita saber acerca de [RAII] (http://stackoverflow.com/questions/712639/). –
Una variable 'auto' también se denomina a veces variable' stack'. ¿Cuántos programadores usan realmente la palabra clave 'auto' de todos modos? –