Skip to content

Capítulo 2: Variables y Tipos de Datos ​

2.1 Nivel Introductorio ​

Declaración y asignación de variables ​

En C++, una variable es un espacio de memoria reservado para almacenar un valor que puede cambiar durante la ejecución del programa. Para declarar una variable, se especifica su tipo de dato y un nombre identificador.

Sintaxis de declaración:

cpp
tipo nombreVariable;

Ejemplos:

cpp
int edad;
float altura;
char inicial;

Para asignar un valor a una variable, se utiliza el operador de asignación =.

Ejemplos de asignación:

cpp
edad = 25;
altura = 1.75f;
inicial = 'A';

También es posible declarar y asignar en una sola línea:

cpp
int edad = 25;
float altura = 1.75f;
char inicial = 'A';

Tipos de datos primitivos ​

Los tipos de datos primitivos son los tipos básicos que proporciona C++ para representar diferentes clases de información.

Tipos numéricos enteros ​

  • int: Entero estándar.
  • short: Entero corto.
  • long: Entero largo.
  • long long: Entero de mayor tamaño.

Ejemplo:

cpp
int numero = 42;
long poblacion = 7800000000;

Tipos de punto flotante ​

  • float: Precisión simple.
  • double: Precisión doble.
  • long double: Mayor precisión.

Ejemplo:

cpp
float precio = 19.99f;
double distancia = 384400.0; // Distancia a la luna en km

Tipo carácter ​

  • char: Representa un carácter individual.

Ejemplo:

cpp
char letra = 'C';

Tipo booleano ​

  • bool: Representa valores lógicos true (verdadero) o false (falso).

Ejemplo:

cpp
bool esMayorDeEdad = true;

Conversiones entre tipos de datos ​

Es común necesitar convertir valores de un tipo de dato a otro. Esto se conoce como casting.

Conversiones implícitas ​

El compilador realiza automáticamente conversiones cuando no hay pérdida de información.

Ejemplo:

cpp
int entero = 10;
double real = entero; // entero se convierte implícitamente a double

Conversiones explícitas ​

Cuando puede haber pérdida de datos, es necesario realizar una conversión explícita.

Sintaxis:

cpp
tipoDestino variableDestino = (tipoDestino) valorOrigen;

Ejemplo:

cpp
double real = 9.7;
int entero = (int) real; // entero vale 9

También se puede usar la sintaxis de C++:

cpp
int entero = static_cast<int>(real);

Nota: Al convertir de un tipo de punto flotante a entero, se pierde la parte decimal.


2.2 Nivel Intermedio ​

Constantes y modificadores de tipo ​

Constantes (const) ​

Las constantes son variables cuyo valor no puede cambiar una vez asignado.

Sintaxis:

cpp
const tipo nombreConstante = valor;

Ejemplo:

cpp
const double PI = 3.1415926535;

Intentar modificar PI resultará en un error de compilación.

Modificadores de tipo ​

Los modificadores alteran el tamaño o el rango de los tipos básicos.

  • signed: Permite números positivos y negativos.
  • unsigned: Solo números positivos (incluido cero).

Ejemplos:

cpp
unsigned int edad = 25;
signed int temperatura = -5;

Enumeraciones ​

Las enumeraciones (enum) permiten definir tipos de datos personalizados con valores constantes.

Sintaxis:

cpp
enum NombreEnum { valor1, valor2, valor3 };

Ejemplo:

cpp
enum Dia { Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo };

Dia hoy = Miercoles;

Por defecto, los valores comienzan en 0 y se incrementan en 1.

Enumeraciones con valores específicos ​

Puedes asignar valores específicos a cada elemento.

cpp
enum Nivel { Bajo = 1, Medio = 5, Alto = 10 };

Nivel intensidad = Medio;

Ámbito y duración de las variables ​

Ámbito (scope) ​

El ámbito determina dónde una variable es accesible.

  • Local: Declarada dentro de una función o bloque {}. Solo accesible dentro de ese bloque.
  • Global: Declarada fuera de todas las funciones. Accesible desde cualquier parte del programa.

Ejemplo de variable local:

cpp
void funcion() {
    int contador = 0; // Variable local
}

Ejemplo de variable global:

cpp
int contadorGlobal = 0; // Variable global

int main() {
    contadorGlobal++;
}

Duración (lifetime) ​

La duración indica cuánto tiempo una variable existe en memoria.

  • Automática: La variable se crea al entrar en su ámbito y se destruye al salir.
  • Estática: La variable persiste durante toda la ejecución del programa.

Variable estática:

cpp
void incrementar() {
    static int contador = 0;
    contador++;
    std::cout << "Contador: " << contador << std::endl;
}

Al llamar repetidamente a incrementar(), el valor de contador se mantiene entre llamadas.


2.3 Nivel Avanzado ​

Tipos de datos definidos por el usuario ​

Estructuras (struct) ​

Las estructuras permiten agrupar variables de diferentes tipos bajo un mismo nombre.

Sintaxis:

cpp
struct NombreEstructura {
    tipo miembro1;
    tipo miembro2;
    // ...
};

Ejemplo:

cpp
struct Persona {
    std::string nombre;
    int edad;
    float estatura;
};

Persona persona1;
persona1.nombre = "Carlos";
persona1.edad = 28;
persona1.estatura = 1.75f;

Clases (class) ​

Aunque se explorarán en profundidad en capítulos posteriores, las clases son similares a las estructuras pero con control de acceso y funcionalidades adicionales.

Uniones (union) ​

Una unión es similar a una estructura, pero todos sus miembros comparten el mismo espacio de memoria. Solo se puede usar un miembro a la vez.

Sintaxis:

cpp
union NombreUnion {
    tipo miembro1;
    tipo miembro2;
    // ...
};

Ejemplo:

cpp
union Dato {
    int entero;
    float real;
    char caracter;
};

Dato dato;
dato.entero = 100;
std::cout << "Entero: " << dato.entero << std::endl;

dato.real = 98.6f;
std::cout << "Real: " << dato.real << std::endl;

Nota: Al asignar un nuevo valor a un miembro, los valores anteriores de los otros miembros se sobrescriben.

Manejo avanzado de tipos y conversiones ​

Definición de tipos personalizados ​

typedef ​

Permite crear un alias para un tipo existente.

Ejemplo:

cpp
typedef unsigned long ulong;

ulong numero = 500000UL;
using (C++11 y posteriores) ​

Alternativa moderna a typedef.

Ejemplo:

cpp
using EnteroGrande = long long;

EnteroGrande cantidad = 10000000000LL;

auto y deducción de tipos ​

El compilador deduce automáticamente el tipo de la variable en base a la expresión asignada.

Ejemplo:

cpp
auto suma = 5 + 3.2; // suma es de tipo double

decltype ​

Deducción del tipo de una expresión sin evaluarla.

Ejemplo:

cpp
int x = 10;
decltype(x) y = 20; // y es de tipo int

Conversiones seguras ​

Los operadores de conversión de C++ proporcionan mayor control y seguridad.

static_cast ​

Conversiones entre tipos relacionados.

Ejemplo:

cpp
double real = 9.99;
int entero = static_cast<int>(real); // entero = 9
dynamic_cast ​

Conversión segura en jerarquías de clases polimórficas.

Ejemplo:

cpp
Base* objBase = new Derivada();
Derivada* objDerivada = dynamic_cast<Derivada*>(objBase);
const_cast ​

Agrega o elimina cualificadores const.

Ejemplo:

cpp
const int valorConstante = 10;
int& referencia = const_cast<int&>(valorConstante);
referencia = 20; // Modifica valorConstante (uso avanzado, se debe tener cuidado)
reinterpret_cast ​

Conversión entre punteros de tipos no relacionados.

Ejemplo:

cpp
int numero = 65;
char* ptrChar = reinterpret_cast<char*>(&numero);
std::cout << *ptrChar << std::endl; // Puede imprimir 'A' (ASCII 65)

Advertencia: reinterpret_cast debe usarse con precaución, ya que puede llevar a comportamientos indefinidos.