Атрибуты (члены данных)
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 9 из 104.
Члены данных (атрибуты) хранят состояние объекта. Обычно они объявляются как private и доступ к ним осуществляется через публичные методы геттеры/сеттеры. Это называется инкапсуляцией.
Закрытые члены данных
class BankAccount {
private:
std::string accountName;
int balance;
};Публичные геттеры и сеттеры
class BankAccount {
private:
std::string accountName;
int balance;
public:
void setBalance(int balance) {
this->balance = balance;
}
int getBalance() {
return this->balance;
}
};Сеттеры с валидацией
void BankAccount::setBalance(int balance) {
if (balance >= 0) {
this->balance = balance;
}
}Спецификаторы доступа
class MyClass {
private: // Доступно только внутри класса
int secret;
public: // Доступно отовсюду
int getSecret() { return secret; }
protected: // Доступно в классе и подклассах
int shared;
};Сделав члены данных private, вы скрываете их от внешнего кода. Геттеры возвращают их значения, а сеттеры изменяют их с возможностью валидации. Это защищает ваши данные и позволяет контролировать доступ к ним.
Задание
СреднеСоздайте класс BankAccount с приватными членами данных и публичными методами доступа:
- Приватные члены:
accountName(string),balance(int) - Сеттеры:
setAccountName,setBalance - Геттеры:
getAccountName,getBalance deposit(int amount)— добавляет к балансу, если amount > 0withdraw(int amount)— возвращает "Success", если это возможно, в противном случае "Insufficient funds"
Шпаргалка
Члены данных (атрибуты) хранят состояние объекта и обычно объявляются private для инкапсуляции.
Закрытые члены данных:
class BankAccount {
private:
std::string accountName;
int balance;
};Публичные геттеры и сеттеры:
class BankAccount {
private:
std::string accountName;
int balance;
public:
void setBalance(int balance) {
this->balance = balance;
}
int getBalance() {
return this->balance;
}
};Сеттеры с валидацией:
void BankAccount::setBalance(int balance) {
if (balance >= 0) {
this->balance = balance;
}
}Спецификаторы доступа:
class MyClass {
private: // Доступно только внутри класса
int secret;
public: // Доступно отовсюду
int getSecret() { return secret; }
protected: // Доступно в классе и подклассах
int shared;
};Попробуйте сами
#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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнер