This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar02_encapsulation/classroom_tasks/code/0book/07public_private.cpp

66 lines
2.8 KiB
C++
Raw Normal View History

2022-09-14 19:05:27 +03:00
/*
Сокрытие данных - это разделение данных и функций абстрактного объекта на открытые (видимые извне) и скрытые (видимые только внутри самого объекта)
В языке C++ это реализуется с помощью модификаторов доступа public и private
Все поля и методы объявленные в секции public называются публичными и могут быть доступны извне структуры
Все поля и методы объявленные в секции private называются приватными и не могут быть доступны извне структуры
Приватные поля и методы могут быть доступны только в методах самого структуры (а также в друзьях, но об этом позже)
Назначение сокрытия данных заключается в том, чтобы объекты нельзя было 'поломать' извне
'Поломать' тут означает задать поля объекта бессмысленным образом
Например, в нашем примере мы бы могли поломать объект просто сделав поля price или pages отрицательными
a.pages = -100;
но благодаря тому, что поле pages является приватным, это сделать нельзя.
Учитывая проверку в конструкторе, получается, что поля pages и price в принципе никогда не смогут стать отрицательными.
Таким образом мы уберегли себя от возникновения ошибок при неправильном задании полей структуры.
*/
#include <iostream>
#include <cmath>
#include <string.h>
#include <cstdlib>
using std::cout, std::endl;
struct Book
{
private:
char title[100];
float price;
int pages;
public:
Book(const char aTitle[], float aPrice, int aPages)
{
if (aPages < 0 || aPrice < 0 || strlen(aTitle) >= 100)
{
cout << "Error while creating Book!" << endl;
std::exit(1);
}
strcpy(title, aTitle);
price = aPrice;
pages = aPages;
}
void print() const
{
cout << title << ", price = " << price << ", pages = " << pages << endl;
}
};
int main()
{
Book a = Book("War and Peace", 1700, 900);
a.print();
a.pages = -100;
}