SlideShare una empresa de Scribd logo
2
Lo más leído
10
Lo más leído
TIPOS DE DATOS PARA
C++
Pedraza Tavera Oscar Alejandro
Ríos Reyes Jesús Julián
• El concepto de tipo es muy importante en C++. Cada variable,
argumento de función y valor devuelto por una función debe tener un
tipo para compilarse. Asimismo, antes de evaluar cada una de las
expresiones (incluidos los valores literales), el compilador da
implícitamente un tipo a estas expresiones. Algunos ejemplos de tipos
son int, que almacena valores integrales, double, que almacena valores
de punto flotante (también conocidos como tipos de datos escalares) o
la clase std::basic_string de la biblioteca estándar, que almacena texto.
Puede crear su propio tipo definiendo un objeto class o struct. El tipo
especifica la cantidad de memoria que se asignará para la variable (o el
resultado de la expresión), las clases de valores que se pueden
almacenar en esa variable, cómo se interpretan estos valores (como
patrones de bits) y las operaciones que se pueden realizar en ella. Este
artículo contiene información general sobre las principales
características del sistema de tipos de C++.
Terminología
• Variable: nombre simbólico de una cantidad de datos. Este nombre se puede utilizar para
acceder a los datos a los que hace referencia en el ámbito del código en el que se define. En
C++, el término “variable” se utiliza normalmente para hacer referencia a las instancias de
tipos de datos escalares, mientras que las instancias de otros tipos normalmente se
denominan “objetos”.
• Objeto: por simplicidad y coherencia, en este artículo se utiliza el término “objeto” para
hacer referencia a cualquier instancia de una clase o estructura. Cuando se utiliza en sentido
general, incluye todos los tipos, incluso las variables escalares.
• Tipo POD (datos estándar): esta categoría informal de tipos de datos de C++ hace referencia a
los tipos que son escalares (vea la sección de tipos fundamentales) o que son clases POD. Una
clase POD no tiene ningún miembro de datos estático que no sea también POD, y no tiene
ningún constructor definido por el usuario, ningún destructor definido por el usuario ni ningún
operador de asignación definido por el usuario. Además, las clases POD no tienen funciones
virtuales, clases base ni ningún miembro de datos no estático privado o protegido. Los tipos
POD suelen utilizarse para el intercambio de datos externos, por ejemplo, con un módulo
escrito en lenguaje C (que solo tiene tipos POD).
Especificar tipos de variable y función
C++ es un lenguaje fuertemente tipado y que, además, contiene tipos estáticos.
Cada objeto tiene un tipo y ese tipo nunca cambia (no debe confundirse con los
objetos de datos estáticos).
Al declarar una variable en el código, debe especificar explícitamente su tipo o
utilizar la palabra clave auto para indicar al compilador que deduzca el tipo desde
el inicializador.
Al declarar una función en el código, debe especificar el tipo de cada argumento
y su valor devuelto (o void, si la función no devuelve ningún valor). La excepción
se produce cuando se utilizan plantillas de función, que están permitidas en los
argumentos de tipos arbitrarios.
Una vez que se declara por primera vez una variable, no se puede cambiar su
tipo. Sin embargo, el valor de la variable o el valor devuelto por una función se
puede copiar en otra variable de distinto tipo. Este tipo de operaciones se
denominan conversiones de tipo. Estas conversiones a veces resultan necesarias,
aunque también pueden producir errores o pérdidas de datos.
Cuando se declara una variable de tipo POD, se recomienda
encarecidamente iniciarla, lo que significa darle un valor inicial.
Una variable, hasta que se inicializa, tiene el valor "no
utilizado", que se compone de los bits que estaban previamente
en esa ubicación de memoria. Este es un aspecto importante de
C++ que debe recordarse, sobre todo si anteriormente utilizaba
otro lenguaje que controlaba la inicialización sin su
intervención. Cuando se declara una variable de un tipo que
pertenece una clase que no es POD, el constructor controla la
inicialización.
En el ejemplo siguiente se muestran algunas sencillas
declaraciones de variable con descripciones de cada una de
ellas. En el ejemplo se muestra también cómo el compilador
utiliza la información de tipo para permitir o no permitir que
posteriormente se realicen ciertas operaciones en la variable.
Ejemplo
Tipos (integrados) fundamentales
A diferencia de algunos lenguajes, C++ no tiene un tipo base universal del que se deriven
todos los demás tipos. La implementación del lenguaje en Visual C++ contiene muchos
tipos fundamentales, también conocidos como tipos integrados. Esto incluye los tipos
numéricos, como int, double, long y bool, además de los tipos char y wchar_t para los
caracteres ASCII y Unicode, respectivamente. La mayoría de los tipos fundamentales
(excepto bool, double, wchar_t y tipos relacionados) tienen versiones sin signo, que
modifican el intervalo de valores que la variable puede almacenar. Por ejemplo, un valor
int, que almacena un entero de 32 bits con signo, puede representar un valor comprendido
entre -2.147.483.648 y 2.147.483.647. Un valor unsigned int, que también se almacena
como 32 bits, puede almacenar un valor comprendido entre 0 y 4.294.967.295. El número
total de valores posibles en cada caso es el mismo; solo cambia el intervalo.
El compilador reconoce los tipos fundamentales y tiene reglas integradas que rigen las
operaciones que se pueden realizar en esos tipos y cómo se pueden convertir en otros tipos
fundamentales. Para obtener una lista completa de los tipos integrados y sus límites de
tamaño y numéricos, vea Tipos fundamentales.
En la ilustración
siguiente se
muestran los
tamaños relativos
de los tipos
integrados:
Tipos de datos para C++
El tipo void
• El tipo void es un tipo especial. No se puede declarar una variable
de tipo void, pero se puede declarar una variable de tipo void *
(puntero a void), lo que a veces resulta necesario cuando se asigna
memoria (sin tipo) sin formato. Sin embargo, los punteros a void
no tienen seguridad de tipos y, por lo general, su uso se
desaconseja completamente en el lenguaje C++ actual. En una
declaración de función, un valor devuelto de tipo void significa
que la función no devuelve un valor; se trata de un uso común y
aceptable de void. Aunque el lenguaje C requería que las
funciones que no tenían ningún parámetro declararan void en la
lista de parámetros
Tipos string
• En sentido estricto, el lenguaje C++ no tiene un tipo “string” integrado.
char y wchar_t almacenan caracteres individuales: es necesario declarar
una matriz de estos tipos para aproximarse a una cadena y agregar un
valor final null (por ejemplo, ‘0’ en ASCII) al elemento de matriz
después del último carácter válido (también denominado “cadena de
estilo C“). En las cadenas de estilo C, era necesario escribir mucho más
código o usar funciones de bibliotecas de utilidades de cadena externas.
Sin embargo, en el lenguaje C++ actual, tenemos los tipos de la
biblioteca estándar std::string (para cadenas de caracteres de tipo char
de 8 bits) o std::wstring (para cadenas de caracteres de tipo wchar_t de
16 bits). Estos contenedores STL se pueden considerar tipos de cadena
nativos, ya que forman parte de las bibliotecas estándar que se incluyen
en cualquier entorno de compilación conforme a C++. Solo tiene que
usar la directiva #include <string> para que estos tipos estén disponibles
en el programa. (Si usa MFC o ATL, la clase CString también está
disponible, pero no forma parte del estándar de C++). En el lenguaje C++
actual, se desaconseja completamente usar matrices de caracteres que
terminen con un valor null (las cadenas de estilo C mencionadas
previamente).
Tipos definidos por el usuario
Cuando se define un objeto class, struct, union o enum, esa construcción se utiliza en el resto del código
como si fuera un tipo fundamental. Esa construcción tiene un tamaño conocido en memoria y se aplican
ciertas reglas sobre su uso durante la comprobación en tiempo de compilación y, en tiempo de ejecución,
durante la vida útil del programa. Las diferencias principales entre los tipos fundamentales integrados y los
tipos definidos por el usuario son las siguientes:
• El compilador no tiene conocimiento integrado de un tipo definido por el usuario. El compilador “conoce”
el tipo la primera vez que encuentra la definición durante el proceso de compilación.
• El usuario especifica las operaciones que se pueden realizar en el tipo y cómo se puede convertir en otros
tipos definiendo (mediante sobrecarga) los operadores adecuados, como los miembros de clase o las
funciones que no son miembro. Para obtener más información, vea Sobrecargar (C++).
• No es necesario que tengan tipos estáticos (la regla establece que el tipo de un objeto nunca cambia). A
través de los mecanismos de herencia y polimorfismo, una variable declarada como un tipo de clase
definido por el usuario (a la que se hace referencia como una instancia de objeto de una clase) podría
tener un tipo diferente en tiempo de ejecución que en tiempo de compilación. Para obtener más
información, vea Herencia.
Tipos de puntero
Desde las primeras versiones del lenguaje C, C++ sigue permitiendo declarar
una variable de un tipo de puntero mediante el declarador especial *
(asterisco). Un tipo de puntero almacena la dirección de la ubicación en
memoria donde se almacena el valor de datos real. En el lenguaje C++ actual,
estos punteros se denominan punteros sin formato y se accede a ellos en el
código a través de los operadores especiales * (asterisco) o -> (guion con el
símbolo "mayor que"). Esto se denomina desreferenciar y el operador que se
utilice dependerá de si se va a desreferenciar un puntero a un valor escalar o
un puntero a un miembro de un objeto. Trabajar con tipos de puntero ha sido
uno de los aspectos más difíciles y confusos del desarrollo de programación de
C y C++. En esta sección se describen algunos hechos y prácticas de ayuda
sobre el uso de punteros sin formato, aunque en el lenguaje C++ actual ya no
es necesario (o no se recomienda) utilizar punteros sin formato para la
propiedad del objeto gracias a la evolución del puntero inteligente (más
información al final de esta sección). Todavía resulta útil y seguro utilizar
punteros sin formato para inspeccionar objetos, pero si es necesario
utilizarlos para la propiedad del objeto, debe hacerse con precaución y debe
valorarse cuidadosamente el modo en que los objetos de su propiedad se
crean y se destruyen.
• Lo primero que debe saber es que, al declarar una variable de
puntero sin formato, se asignará solo la memoria necesaria para
almacenar una dirección de la ubicación de memoria a la que el
puntero hará referencia cuando esté desreferenciado. La
asignación de memoria para el propio valor de datos (también
denominada memoria auxiliar) todavía no está asignada. Es decir,
al declarar una variable de puntero sin formato, se crea una
variable de la dirección de memoria, no una variable real de los
datos. Si se desreferencia una variable de puntero antes de tener
la seguridad de que contiene una dirección válida en una memoria
auxiliar, se producirá un comportamiento no definido
(normalmente un error irrecuperable) en el programa.
Tipos de datos de Windows
En la programación Win32 clásica de C y C++, la mayoría de las funciones utilizan
definiciones de tipos y macros #define (definidas en windef.h) específicas de Windows
para especificar los tipos de parámetros y los valores devueltos. La mayoría de estos
“tipos de datos de Windows” son solo nombres especiales (alias) especificados en los
tipos integrados de C/C++. Para obtener una lista completa de estas definiciones de
tipo y las definiciones de preprocesador, vea Windows Data Types. Algunas de estas
definiciones de tipos, como HRESULT y LCID, son útiles y significativas. Otras, como
INT, no tienen ningún significado especial y son solo alias para los tipos fundamentales
de C++. Otros tipos de datos de Windows tienen nombres que se provienen de la época
de programación de C y de los procesadores de 16 bits, y no tienen ningún propósito o
significado en el hardware y sistemas operativos modernos. Hay también tipos de
datos especiales asociados a la biblioteca de Windows en tiempo de ejecución, que se
muestran como Windows Runtime base data types. En el lenguaje C++ actual, la regla
general establece una preferencia por los tipos fundamentales de C++, a menos que el
tipo de Windows comunique un significado adicional sobre cómo debe interpretarse el
valor.

Más contenido relacionado

PPTX
Operator overloading
PPTX
Classes and objects
PPTX
Function in c program
PPT
C++ classes tutorials
PPT
CHAPTER-7 C++ PROGRAMMING ( STRUCTURE IN C++)
PPTX
Super keyword in java
PPTX
classes and objects in C++
PDF
Function overloading ppt
Operator overloading
Classes and objects
Function in c program
C++ classes tutorials
CHAPTER-7 C++ PROGRAMMING ( STRUCTURE IN C++)
Super keyword in java
classes and objects in C++
Function overloading ppt

La actualidad más candente (20)

PPTX
Python dictionary
PPTX
Operators in C
PPTX
Templates in C++
PPTX
Pointers, virtual function and polymorphism
PPTX
Datatype in c++ unit 3 -topic 2
PPT
14 Caracteres Y Cadenas
PPTX
Pointers,virtual functions and polymorphism cpp
PPTX
Presentation on C Switch Case Statements
PPT
Function in C Language
ODP
Function
PPTX
Programación C++
PPT
FUNCTIONS IN c++ PPT
PPT
Automatas de pila
PDF
Constructors destructors
PPT
Unions in c
PPTX
Unidad1 y 2
PPT
Method overriding
PPTX
C Programming: Control Structure
PPTX
Member Function in C++
PDF
Programming Fundamentals Functions in C and types
Python dictionary
Operators in C
Templates in C++
Pointers, virtual function and polymorphism
Datatype in c++ unit 3 -topic 2
14 Caracteres Y Cadenas
Pointers,virtual functions and polymorphism cpp
Presentation on C Switch Case Statements
Function in C Language
Function
Programación C++
FUNCTIONS IN c++ PPT
Automatas de pila
Constructors destructors
Unions in c
Unidad1 y 2
Method overriding
C Programming: Control Structure
Member Function in C++
Programming Fundamentals Functions in C and types
Publicidad

Similar a Tipos de datos para C++ (20)

PPTX
Tipos de datos_para_c_(2)
DOCX
Actividades 1-7
DOCX
Actividades 1 7
DOCX
Actividades 1 7
DOCX
Actividades 1 7
PPTX
Tipos de datos c++
PPTX
TIPOS DE DATOS PARA C++
PPTX
Tipos de datos para C++
PPTX
Tutorial C++
PPTX
tutorial de c++
PPTX
Tipos de datos_para_c++
PPTX
Tipo de datos_c_
PPTX
TIPOS DE DATOS PARA C++
PPTX
Tipos de datos primitivos en c++
PPTX
Tipos de datos ok
PPTX
Tipos de datos para C++
PPTX
Tipos de datos_de_virtual_c_
PPTX
Aelrs (1)
PPTX
Tipos de datos_para_c_
PPTX
Tipos de datos_para_c_++
Tipos de datos_para_c_(2)
Actividades 1-7
Actividades 1 7
Actividades 1 7
Actividades 1 7
Tipos de datos c++
TIPOS DE DATOS PARA C++
Tipos de datos para C++
Tutorial C++
tutorial de c++
Tipos de datos_para_c++
Tipo de datos_c_
TIPOS DE DATOS PARA C++
Tipos de datos primitivos en c++
Tipos de datos ok
Tipos de datos para C++
Tipos de datos_de_virtual_c_
Aelrs (1)
Tipos de datos_para_c_
Tipos de datos_para_c_++
Publicidad

Más de juliancetis109 (20)

PPTX
Instrucciones básicas C++
PPTX
Estructura basica de un programa en C++
PPTX
Tablas de verdad para c++
PPTX
Ley de la jerarquÍa de las operaciones
PPTX
Tutorial de visual C++
PPTX
Tutorial Codeblocks
PPTX
Tutorial
PPTX
Tutorial de visual c++
DOCX
Operaciones básicas
DOCX
Promedios
DOCX
Transportes
DOCX
DOCX
Gráfica 2
DOCX
Gráfica 1
DOCX
DOCX
DOCX
DOCX
DOCX
DOCX
Formato base
Instrucciones básicas C++
Estructura basica de un programa en C++
Tablas de verdad para c++
Ley de la jerarquÍa de las operaciones
Tutorial de visual C++
Tutorial Codeblocks
Tutorial
Tutorial de visual c++
Operaciones básicas
Promedios
Transportes
Gráfica 2
Gráfica 1
Formato base

Último (20)

PDF
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
PPTX
Welcome to the 7th Science Class 2025-2026 Online.pptx
PDF
Como Potenciar las Emociones Positivas y Afrontar las Negativas Ccesa007.pdf
DOCX
V UNIDAD - PRIMER GRADO. del mes de agosto
DOCX
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
DOCX
V UNIDAD - SEGUNDO GRADO. del mes de agosto
PDF
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
PDF
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
PDF
Mi Primer Millon - Poissant - Godefroy Ccesa007.pdf
DOCX
PLAN DE CASTELLANO 2021 actualizado a la normativa
PDF
Híper Mega Repaso Histológico Bloque 3.pdf
PDF
1. Intrdoduccion y criterios de seleccion de Farm 2024.pdf
PDF
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
PDF
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
DOCX
Informe_practica pre Final.docxddadssasdddddddddddddddddddddddddddddddddddddddd
PPTX
caso clínico iam clinica y semiología l3.pptx
PDF
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
PDF
Fundamentos_Educacion_a_Distancia_ABC.pdf
PDF
TOMO II - LITERATURA.pd plusenmas ultras
La Evaluacion Formativa en Nuevos Escenarios de Aprendizaje UGEL03 Ccesa007.pdf
Welcome to the 7th Science Class 2025-2026 Online.pptx
Como Potenciar las Emociones Positivas y Afrontar las Negativas Ccesa007.pdf
V UNIDAD - PRIMER GRADO. del mes de agosto
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
V UNIDAD - SEGUNDO GRADO. del mes de agosto
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
Mi Primer Millon - Poissant - Godefroy Ccesa007.pdf
PLAN DE CASTELLANO 2021 actualizado a la normativa
Híper Mega Repaso Histológico Bloque 3.pdf
1. Intrdoduccion y criterios de seleccion de Farm 2024.pdf
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
Informe_practica pre Final.docxddadssasdddddddddddddddddddddddddddddddddddddddd
caso clínico iam clinica y semiología l3.pptx
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
Fundamentos_Educacion_a_Distancia_ABC.pdf
TOMO II - LITERATURA.pd plusenmas ultras

Tipos de datos para C++

  • 1. TIPOS DE DATOS PARA C++ Pedraza Tavera Oscar Alejandro Ríos Reyes Jesús Julián
  • 2. • El concepto de tipo es muy importante en C++. Cada variable, argumento de función y valor devuelto por una función debe tener un tipo para compilarse. Asimismo, antes de evaluar cada una de las expresiones (incluidos los valores literales), el compilador da implícitamente un tipo a estas expresiones. Algunos ejemplos de tipos son int, que almacena valores integrales, double, que almacena valores de punto flotante (también conocidos como tipos de datos escalares) o la clase std::basic_string de la biblioteca estándar, que almacena texto. Puede crear su propio tipo definiendo un objeto class o struct. El tipo especifica la cantidad de memoria que se asignará para la variable (o el resultado de la expresión), las clases de valores que se pueden almacenar en esa variable, cómo se interpretan estos valores (como patrones de bits) y las operaciones que se pueden realizar en ella. Este artículo contiene información general sobre las principales características del sistema de tipos de C++.
  • 3. Terminología • Variable: nombre simbólico de una cantidad de datos. Este nombre se puede utilizar para acceder a los datos a los que hace referencia en el ámbito del código en el que se define. En C++, el término “variable” se utiliza normalmente para hacer referencia a las instancias de tipos de datos escalares, mientras que las instancias de otros tipos normalmente se denominan “objetos”. • Objeto: por simplicidad y coherencia, en este artículo se utiliza el término “objeto” para hacer referencia a cualquier instancia de una clase o estructura. Cuando se utiliza en sentido general, incluye todos los tipos, incluso las variables escalares. • Tipo POD (datos estándar): esta categoría informal de tipos de datos de C++ hace referencia a los tipos que son escalares (vea la sección de tipos fundamentales) o que son clases POD. Una clase POD no tiene ningún miembro de datos estático que no sea también POD, y no tiene ningún constructor definido por el usuario, ningún destructor definido por el usuario ni ningún operador de asignación definido por el usuario. Además, las clases POD no tienen funciones virtuales, clases base ni ningún miembro de datos no estático privado o protegido. Los tipos POD suelen utilizarse para el intercambio de datos externos, por ejemplo, con un módulo escrito en lenguaje C (que solo tiene tipos POD).
  • 4. Especificar tipos de variable y función C++ es un lenguaje fuertemente tipado y que, además, contiene tipos estáticos. Cada objeto tiene un tipo y ese tipo nunca cambia (no debe confundirse con los objetos de datos estáticos). Al declarar una variable en el código, debe especificar explícitamente su tipo o utilizar la palabra clave auto para indicar al compilador que deduzca el tipo desde el inicializador. Al declarar una función en el código, debe especificar el tipo de cada argumento y su valor devuelto (o void, si la función no devuelve ningún valor). La excepción se produce cuando se utilizan plantillas de función, que están permitidas en los argumentos de tipos arbitrarios. Una vez que se declara por primera vez una variable, no se puede cambiar su tipo. Sin embargo, el valor de la variable o el valor devuelto por una función se puede copiar en otra variable de distinto tipo. Este tipo de operaciones se denominan conversiones de tipo. Estas conversiones a veces resultan necesarias, aunque también pueden producir errores o pérdidas de datos.
  • 5. Cuando se declara una variable de tipo POD, se recomienda encarecidamente iniciarla, lo que significa darle un valor inicial. Una variable, hasta que se inicializa, tiene el valor "no utilizado", que se compone de los bits que estaban previamente en esa ubicación de memoria. Este es un aspecto importante de C++ que debe recordarse, sobre todo si anteriormente utilizaba otro lenguaje que controlaba la inicialización sin su intervención. Cuando se declara una variable de un tipo que pertenece una clase que no es POD, el constructor controla la inicialización. En el ejemplo siguiente se muestran algunas sencillas declaraciones de variable con descripciones de cada una de ellas. En el ejemplo se muestra también cómo el compilador utiliza la información de tipo para permitir o no permitir que posteriormente se realicen ciertas operaciones en la variable.
  • 7. Tipos (integrados) fundamentales A diferencia de algunos lenguajes, C++ no tiene un tipo base universal del que se deriven todos los demás tipos. La implementación del lenguaje en Visual C++ contiene muchos tipos fundamentales, también conocidos como tipos integrados. Esto incluye los tipos numéricos, como int, double, long y bool, además de los tipos char y wchar_t para los caracteres ASCII y Unicode, respectivamente. La mayoría de los tipos fundamentales (excepto bool, double, wchar_t y tipos relacionados) tienen versiones sin signo, que modifican el intervalo de valores que la variable puede almacenar. Por ejemplo, un valor int, que almacena un entero de 32 bits con signo, puede representar un valor comprendido entre -2.147.483.648 y 2.147.483.647. Un valor unsigned int, que también se almacena como 32 bits, puede almacenar un valor comprendido entre 0 y 4.294.967.295. El número total de valores posibles en cada caso es el mismo; solo cambia el intervalo. El compilador reconoce los tipos fundamentales y tiene reglas integradas que rigen las operaciones que se pueden realizar en esos tipos y cómo se pueden convertir en otros tipos fundamentales. Para obtener una lista completa de los tipos integrados y sus límites de tamaño y numéricos, vea Tipos fundamentales.
  • 8. En la ilustración siguiente se muestran los tamaños relativos de los tipos integrados:
  • 10. El tipo void • El tipo void es un tipo especial. No se puede declarar una variable de tipo void, pero se puede declarar una variable de tipo void * (puntero a void), lo que a veces resulta necesario cuando se asigna memoria (sin tipo) sin formato. Sin embargo, los punteros a void no tienen seguridad de tipos y, por lo general, su uso se desaconseja completamente en el lenguaje C++ actual. En una declaración de función, un valor devuelto de tipo void significa que la función no devuelve un valor; se trata de un uso común y aceptable de void. Aunque el lenguaje C requería que las funciones que no tenían ningún parámetro declararan void en la lista de parámetros
  • 11. Tipos string • En sentido estricto, el lenguaje C++ no tiene un tipo “string” integrado. char y wchar_t almacenan caracteres individuales: es necesario declarar una matriz de estos tipos para aproximarse a una cadena y agregar un valor final null (por ejemplo, ‘0’ en ASCII) al elemento de matriz después del último carácter válido (también denominado “cadena de estilo C“). En las cadenas de estilo C, era necesario escribir mucho más código o usar funciones de bibliotecas de utilidades de cadena externas. Sin embargo, en el lenguaje C++ actual, tenemos los tipos de la biblioteca estándar std::string (para cadenas de caracteres de tipo char de 8 bits) o std::wstring (para cadenas de caracteres de tipo wchar_t de 16 bits). Estos contenedores STL se pueden considerar tipos de cadena nativos, ya que forman parte de las bibliotecas estándar que se incluyen en cualquier entorno de compilación conforme a C++. Solo tiene que usar la directiva #include <string> para que estos tipos estén disponibles en el programa. (Si usa MFC o ATL, la clase CString también está disponible, pero no forma parte del estándar de C++). En el lenguaje C++ actual, se desaconseja completamente usar matrices de caracteres que terminen con un valor null (las cadenas de estilo C mencionadas previamente).
  • 12. Tipos definidos por el usuario Cuando se define un objeto class, struct, union o enum, esa construcción se utiliza en el resto del código como si fuera un tipo fundamental. Esa construcción tiene un tamaño conocido en memoria y se aplican ciertas reglas sobre su uso durante la comprobación en tiempo de compilación y, en tiempo de ejecución, durante la vida útil del programa. Las diferencias principales entre los tipos fundamentales integrados y los tipos definidos por el usuario son las siguientes: • El compilador no tiene conocimiento integrado de un tipo definido por el usuario. El compilador “conoce” el tipo la primera vez que encuentra la definición durante el proceso de compilación. • El usuario especifica las operaciones que se pueden realizar en el tipo y cómo se puede convertir en otros tipos definiendo (mediante sobrecarga) los operadores adecuados, como los miembros de clase o las funciones que no son miembro. Para obtener más información, vea Sobrecargar (C++). • No es necesario que tengan tipos estáticos (la regla establece que el tipo de un objeto nunca cambia). A través de los mecanismos de herencia y polimorfismo, una variable declarada como un tipo de clase definido por el usuario (a la que se hace referencia como una instancia de objeto de una clase) podría tener un tipo diferente en tiempo de ejecución que en tiempo de compilación. Para obtener más información, vea Herencia.
  • 13. Tipos de puntero Desde las primeras versiones del lenguaje C, C++ sigue permitiendo declarar una variable de un tipo de puntero mediante el declarador especial * (asterisco). Un tipo de puntero almacena la dirección de la ubicación en memoria donde se almacena el valor de datos real. En el lenguaje C++ actual, estos punteros se denominan punteros sin formato y se accede a ellos en el código a través de los operadores especiales * (asterisco) o -> (guion con el símbolo "mayor que"). Esto se denomina desreferenciar y el operador que se utilice dependerá de si se va a desreferenciar un puntero a un valor escalar o un puntero a un miembro de un objeto. Trabajar con tipos de puntero ha sido uno de los aspectos más difíciles y confusos del desarrollo de programación de C y C++. En esta sección se describen algunos hechos y prácticas de ayuda sobre el uso de punteros sin formato, aunque en el lenguaje C++ actual ya no es necesario (o no se recomienda) utilizar punteros sin formato para la propiedad del objeto gracias a la evolución del puntero inteligente (más información al final de esta sección). Todavía resulta útil y seguro utilizar punteros sin formato para inspeccionar objetos, pero si es necesario utilizarlos para la propiedad del objeto, debe hacerse con precaución y debe valorarse cuidadosamente el modo en que los objetos de su propiedad se crean y se destruyen.
  • 14. • Lo primero que debe saber es que, al declarar una variable de puntero sin formato, se asignará solo la memoria necesaria para almacenar una dirección de la ubicación de memoria a la que el puntero hará referencia cuando esté desreferenciado. La asignación de memoria para el propio valor de datos (también denominada memoria auxiliar) todavía no está asignada. Es decir, al declarar una variable de puntero sin formato, se crea una variable de la dirección de memoria, no una variable real de los datos. Si se desreferencia una variable de puntero antes de tener la seguridad de que contiene una dirección válida en una memoria auxiliar, se producirá un comportamiento no definido (normalmente un error irrecuperable) en el programa.
  • 15. Tipos de datos de Windows En la programación Win32 clásica de C y C++, la mayoría de las funciones utilizan definiciones de tipos y macros #define (definidas en windef.h) específicas de Windows para especificar los tipos de parámetros y los valores devueltos. La mayoría de estos “tipos de datos de Windows” son solo nombres especiales (alias) especificados en los tipos integrados de C/C++. Para obtener una lista completa de estas definiciones de tipo y las definiciones de preprocesador, vea Windows Data Types. Algunas de estas definiciones de tipos, como HRESULT y LCID, son útiles y significativas. Otras, como INT, no tienen ningún significado especial y son solo alias para los tipos fundamentales de C++. Otros tipos de datos de Windows tienen nombres que se provienen de la época de programación de C y de los procesadores de 16 bits, y no tienen ningún propósito o significado en el hardware y sistemas operativos modernos. Hay también tipos de datos especiales asociados a la biblioteca de Windows en tiempo de ejecución, que se muestran como Windows Runtime base data types. En el lenguaje C++ actual, la regla general establece una preferencia por los tipos fundamentales de C++, a menos que el tipo de Windows comunique un significado adicional sobre cómo debe interpretarse el valor.