Introducción a las clases en C++
Aprende los fundamentos de las clases en C++, incluyendo definición de clases, objetos y programación orientada a objetos.
El concepto fundamental de la programación orientada a objetos (POO) es la clase. En C++, las clases agrupan los datos (propiedades) y los comportamientos asociados (métodos) en una sola estructura. En este artículo aprenderás a definir una clase, crear objetos, acceder a sus miembros y establecer relaciones entre clases.
1. ¿Qué es una clase?
Una clase es un modelo abstracto de un concepto o entidad. Puede considerarse la representación en el programa de un objeto del mundo real. Por ejemplo, un objeto “Libro” puede tener propiedades como autor, editorial y número de páginas.
En C++, una clase se define de la siguiente manera:
class NombreDeClase {
public:
// Propiedades (atributos)
// Métodos (funciones miembro)
};
2. La clase Book: un ejemplo sencillo
En el siguiente ejemplo se define una clase Book. Esta clase contiene las propiedades y comportamientos básicos de un libro.
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
string author;
int pageCount;
double price;
bool available;
public:
// Constructor
Book(string t, string a, int p, double pr, bool av)
: title(t), author(a), pageCount(p), price(pr), available(av) {}
// Métodos getter y setter
string GetTitle() const { return title; }
void SetTitle(string t) { title = t; }
string GetAuthor() const { return author; }
void SetAuthor(string a) { author = a; }
int GetPageCount() const { return pageCount; }
void DisplayInfo() const {
cout << "Libro: " << title << endl;
cout << "Autor: " << author << endl;
cout << "Páginas: " << pageCount << endl;
cout << "Precio: " << price << " €" << endl;
cout << (available ? "Disponible" : "No disponible") << endl;
}
};
Los miembros private solo son accesibles dentro de la clase.
Este principio se conoce como encapsulación.
Los métodos public pueden llamarse desde fuera de la clase.
3. Uso de la clase Book
La clase definida ahora puede utilizarse como un tipo de dato.
Podemos crear objetos del tipo Book y llamar a sus métodos.
int main() {
Book b1("Programación en C++", "Bjarne Stroustrup", 1350, 240.0, true);
b1.DisplayInfo();
b1.SetTitle("Programación Moderna en C++");
cout << "\nNuevo título: " << b1.GetTitle() << endl;
return 0;
}
Salida:
Libro: Programación en C++
Autor: Bjarne Stroustrup
Páginas: 1350
Precio: 240 €
Disponible
Nuevo título: Programación Moderna en C++
4. Clases relacionadas: Author y Publisher
En la vida real, un libro no solo tiene un título, sino también un autor y una editorial. En este caso, podemos usar otras clases dentro de la clase Book mediante composición.
class Author {
private:
string name;
string country;
public:
Author(string n, string c) : name(n), country(c) {}
string GetInfo() const { return name + " (" + country + ")"; }
};
class Publisher {
private:
string name;
string city;
public:
Publisher(string n, string c) : name(n), city(c) {}
string GetInfo() const { return name + " - " + city; }
};
class Book {
private:
string title;
Author author;
Publisher publisher;
int pageCount;
public:
Book(string t, Author a, Publisher p, int pages)
: title(t), author(a), publisher(p), pageCount(pages) {}
void DisplayInfo() const {
cout << "Libro: " << title << endl;
cout << "Autor: " << author.GetInfo() << endl;
cout << "Editorial: " << publisher.GetInfo() << endl;
cout << "Número de páginas: " << pageCount << endl;
}
};
Aquí, la clase Book contiene instancias de las clases Author y Publisher.
En otras palabras: “Un libro tiene un autor y una editorial” — una relación de tipo has-a.
5. Ejemplo práctico: Sistema de información de libros
El siguiente ejemplo muestra cómo se pueden utilizar juntas las tres clases.
#include <iostream>
#include <string>
using namespace std;
class Author {
private:
string name;
string country;
public:
Author(string n, string c) : name(n), country(c) {}
string GetName() const { return name; }
string GetCountry() const { return country; }
};
class Publisher {
private:
string name;
int foundedYear;
public:
Publisher(string n, int year) : name(n), foundedYear(year) {}
string GetInfo() const {
return name + " (" + to_string(foundedYear) + ")";
}
};
class Book {
private:
string title;
Author author;
Publisher publisher;
int pageCount;
double price;
public:
Book(string t, Author a, Publisher p, int pages, double pr)
: title(t), author(a), publisher(p), pageCount(pages), price(pr) {}
void DisplayInfo() const {
cout << "=== Información del libro ===" << endl;
cout << "Título: " << title << endl;
cout << "Autor: " << author.GetName()
<< " (" << author.GetCountry() << ")" << endl;
cout << "Editorial: " << publisher.GetInfo() << endl;
cout << "Páginas: " << pageCount << endl;
cout << "Precio: " << price << " €" << endl;
}
};
int main() {
Author a("George Orwell", "Reino Unido");
Publisher p("Penguin Books", 1935);
Book b("1984", a, p, 328, 89.90);
b.DisplayInfo();
return 0;
}
Salida:
=== Información del libro ===
Título: 1984
Autor: George Orwell (Reino Unido)
Editorial: Penguin Books (1935)
Páginas: 328
Precio: 89.9 €
Esta estructura es un ejemplo de composición de objetos, donde un objeto (Book) puede contener otros objetos (Author, Publisher). En aplicaciones reales, este tipo de clases suele usarse como modelos de base de datos o estructuras de datos para APIs.
6. TL;DR
- Las clases agrupan datos (propiedades) y comportamientos (métodos).
- Los miembros
privatesolo son accesibles dentro de la clase (encapsulación). - Los métodos
publicproporcionan acceso controlado desde el exterior (getters/setters). - En el ejemplo
Book,AuthoryPublisher, se utilizó una relación «tiene un» (has-a). - El constructor se utiliza para inicializar las propiedades al crear un objeto.
- Todos los ejemplos se pueden ejecutar en Visual Studio 2022 o GCC 11+.