2009-11-16 13 views
5

¿Qué tipos de C++ se pueden crear instancias?¿Qué se puede instanciar?

conozco que después de cada crear directamente una instancia única de Foo:

Foo bar; 
Foo *bizz = new Foo(); 

Sin embargo, ¿qué pasa con una función de los tipos? ¿Lo siguiente crea dos instancias de int, o es una palabra incorrecta y la memoria acaba de ser asignada?

int bar2; 
int *bizz2 = new int; 

¿Qué pasa con punteros? ¿El ejemplo anterior creó una instancia int *, o simplemente asignó memoria para un int *?

¿Usaría literales como 42 o 3.14 para crear una instancia también?

He visto el argumento de que si no se puede subclasificar un tipo, no es una clase, y si no es una clase, no se puede crear una instancia. ¿Es esto cierto?

Respuesta

4

Mientras que estamos hablando de C++, la única fuente autorizada es el estándar ISO. Eso nunca usa la palabra "instanciación" para cualquier cosa que no sean plantillas de clases y funciones.

Sin embargo, utiliza la palabra "instancia". Por ejemplo:

Una instancia de cada objeto con duración de almacenamiento automático (3.7.2) está asociada a cada entrada en su bloque.

Tenga en cuenta que en el lenguaje C++, un lvalue int es también un "objeto":

Las construcciones en un programa en C++ crear, destruir, consulte, acceder y manipular objetos. Un objeto es una región de almacenamiento.

Dado que new crea claramente regiones de almacenamiento, todo lo que se crea es un objeto y, siguiendo el precedente de la especificación, se puede llamar una instancia.

+0

Muy bueno. Gracias. =] – strager

+0

Esta es probablemente la mejor respuesta hasta ahora. Las diferencias entre el estándar C++ y la terminología OOP general son interesantes. La mayoría de los programadores OOP probablemente no llamarían a algo como 'int x' una instancia de un' int', ni tendrían la posibilidad de referirse a un 'int' como un objeto; pero, sin embargo, sería técnicamente correcto referirse a él como tal. –

+1

Sí, la "instancia" citada por Pavel no se está utilizando en absoluto en el sentido OOP habitual, ya que dice "instancia de un objeto", no "instancia de un tipo". Creo que podría ser reemplazado por "un objeto diferente con ..." y significa lo mismo. Yo especulo que la mayoría de los programadores OOP no se referirían a un int como un objeto porque fueron entrenados en Java, donde de hecho un 'int' no es un' Objeto'. Los lenguajes POO más puros no hacen excepciones para los tipos incorporados, por lo que sus enteros son objetos. En Ruby puedes aplicar dinámicamente métodos de parche de mono a la clase que los representa, para que '3.minutos 'sea igual a 180. –

2

en C++ un 'ejemplo' y 'instantiate' se asocia únicamente con Clases

en cuenta sin embargo que estos también son palabras inglesas que pueden tener significado conversacional. 'puntero' es sin duda una clase de cosas en el uso del Inglés y un puntero es sin duda una instancia de esa clase

pero en C++ hablar 'puntero' no es una clase y un puntero no es una instancia de una clase

ver también - el número de ángeles en la cabeza de un alfiler

+0

Sin embargo, hay otros idiomas (smalltalk por ejemplo) donde todo es un objeto, por lo que obtiene instancias de enteros 'etc. – pm100

+0

"en C++ una' instancia 'y' instanciación 'solo está asociada a las clases" - ¿fuente? –

2

El concepto de una "instancia" no es algo que es realmente intrínseca a C++ - básicamente tiene "cosas que tienen un constructor y lo que no lo hacen".

Por lo tanto, todos los tipos tienen un tamaño, p. un int es comúnmente 4 bytes, una estructura con un par de ints va a ser 8 y así sucesivamente. Ahora, ponle un constructor a esa estructura, y comienza a verse (y comportarse) como una clase. Más específicamente:

int foo; // <-- 4 bytes, no constructor 

struct Foo 
{ 
    int foo; 
    int bar; 
}; // <-- 8 bytes, no constructor 

struct Foo 
{ 
    Foo() : foo(0), bar(0) {} 
    int foo; 
    int bar; 
}; // <-- 8 bytes, with constructor 

Ahora, cualquiera de estos tipos puede vivir en la pila o en el montón . Cuando crea algo en la pila , como "int foo;" arriba, desaparece después de que su alcance se va (por ejemplo, al final de la llamada a la función). Si crea algo con "nuevo" va en el montón y obtiene su propio lugar para vivir en la memoria hasta que llame al elimine en él. En ambos casos, se llamará al constructor, si existe, durante la creación de instancias.

1

No es habitual hacer "nueva int", pero está permitido. Incluso puede pasar 0 o 1 argumentos al constructor. No estoy seguro si "new int()" significa que está 0-initialized (supongo que sí) a diferencia de "new int".

Cuando define un valor en la pila, generalmente no se denomina "asignación de memoria" (aunque, en teoría, está obteniendo memoria en la pila, es posible que el valor solo viva en los registros de la CPU).

Literales no necesariamente obtienen una dirección en la memoria del programa; Las instrucciones de CPU pueden codificar datos directamente (por ejemplo, poner 42 en el registro B).Probablemente las constantes de coma flotante arbitrarias tienen una dirección.

+0

Principalmente estoy buscando la respuesta de si un 'int' y otros tipos incorporados pueden * instanciarse *. Supongo que, basado en otras respuestas y su respuesta, un 'int' tiene un constructor por lo tanto puede tener una instancia, ¿correcto? – strager

+0

No, int no tiene un constructor. C++ distingue entre los tipos POD y no POD, donde los tipos POD pueden tener constructores, funciones miembro, variables de miembros privados, etc., y los tipos que no son POD no pueden. –

+0

Las estructuras POD tienen constructores. No tienen constructores _no-triviales_. –

3

Por lo que puedo decir, realmente solo está preguntando por la terminología aquí. La única distinción real hecha por el estándar C++ son los tipos POD y los tipos no POD, donde los tipos no POD tienen características como constructores definidos por el usuario, funciones miembro, variables privadas, etc., y los tipos POD no lo hacen. Los tipos básicos como int y float son, por supuesto, POD, al igual que las matrices de POD y C-structs de POD.

Además de (y se superpone con) C++, el concepto de "instancia" en programación orientada a objetos generalmente se refiere a asignar espacio para un objeto en la memoria y luego inicializarlo con un constructor. Si esto se hace en la pila o el montón, o cualquier otra ubicación en la memoria para el caso, es en gran medida irrelevante.

Sin embargo, el estándar de C++ parece considerar todos los tipos de datos como "objetos". Por ejemplo, en 3,9 se dice:

"La representación objeto de tipo T es la secuencia de N unsigned char objetos tomados por el objeto de tipo T, donde N es igual sizeof (T) .. . "

Básicamente, la única distinción hecha por el estándar C++ en sí es POD versus no POD.

+0

Citar el estándar es excelente. ¡Gracias! Parece un paso en la dirección correcta. – strager

+0

Su afirmación "Los tipos básicos como' int' y 'float' son, por supuesto, no POD, como lo son las matrices de POD y C-structs de POD." parece incorrecto ¿Pretendes reemplazar "no-POD" con "POD" y viceversa? – strager

+0

Bien, lo siento, eso fue un error tipográfico.Edité un poco la publicación y solucioné ese error. –

Cuestiones relacionadas