Atributos (Miembros de datos)
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 9 de 104.
Los miembros de datos (atributos) almacenan el estado de un objeto. Normalmente se declaran como private y se accede a ellos a través de métodos getter/setter públicos. Esto se llama encapsulación.
Miembros de datos privados
class BankAccount {
private:
std::string accountName;
int balance;
};Getters y setters públicos
class BankAccount {
private:
std::string accountName;
int balance;
public:
void setBalance(int balance) {
this->balance = balance;
}
int getBalance() {
return this->balance;
}
};Setters con validación
void BankAccount::setBalance(int balance) {
if (balance >= 0) {
this->balance = balance;
}
}Especificadores de acceso
class MyClass {
private: // Solo accesible dentro de la clase
int secret;
public: // Accesible desde cualquier lugar
int getSecret() { return secret; }
protected: // Accesible en la clase y subclases
int shared;
};Hacer que los miembros de datos sean private los oculta del código externo. Los getters devuelven sus valores, los setters los modifican con validación opcional. Esto protege tus datos y controla cómo se accede a ellos.
Desafío
IntermedioCrea una clase BankAccount con miembros de datos privados y métodos de acceso públicos:
- Miembros privados:
accountName(string),balance(int) - Setters:
setAccountName,setBalance - Getters:
getAccountName,getBalance deposit(int amount)— añade al saldo si amount > 0withdraw(int amount)— devuelve "Success" si es posible, de lo contrario "Insufficient funds"
Hoja de referencia
Los miembros de datos (atributos) almacenan el estado de un objeto y normalmente se declaran como private para el encapsulamiento.
Miembros de datos privados:
class BankAccount {
private:
std::string accountName;
int balance;
};Getters y setters públicos:
class BankAccount {
private:
std::string accountName;
int balance;
public:
void setBalance(int balance) {
this->balance = balance;
}
int getBalance() {
return this->balance;
}
};Setters con validación:
void BankAccount::setBalance(int balance) {
if (balance >= 0) {
this->balance = balance;
}
}Especificadores de acceso:
class MyClass {
private: // Solo accesible dentro de la clase
int secret;
public: // Accesible desde cualquier lugar
int getSecret() { return secret; }
protected: // Accesible en la clase y subclases
int shared;
};Pruébalo tú mismo
#include <iostream>
#include "BankAccount.h"
int main() {
std::string name;
int initial, depositAmt;
std::getline(std::cin, name);
std::cin >> initial >> depositAmt;
BankAccount account;
account.setAccountName(name);
account.setBalance(initial);
std::cout << "Account: " << account.getAccountName() << std::endl;
std::cout << "Balance: " << account.getBalance() << std::endl;
account.deposit(depositAmt);
std::cout << "After deposit: " << account.getBalance() << std::endl;
std::string result = account.withdraw(2000);
std::cout << "Withdraw 2000: " << result << std::endl;
std::cout << "Final Balance: " << account.getBalance() << std::endl;
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genérico