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
2022-09-14 19:05:27 +03:00

65 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Сокрытие данных - это разделение данных и функций абстрактного объекта на открытые (видимые извне) и скрытые (видимые только внутри самого объекта)
В языке 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;
}