Внутри класса точно так же, как и внутри структуры, можно объявлять поля. Таким образом, наш класс ТМопеу отличается от структуры ТМопеу только одним словом class (листинг 1.7).
Листинг 1.7. Класс ТМопеу class ТМопеу
{ long double Summa; // денежная сумма
};
Но это не единственное, и тем более, не самое важное различие. Гораздо важнее то, что по умолчанию все, что объявлено внутри класса, недоступно извне. Это сразу накладывает ограничение на инициализацию. Например, определим класс
Person с полями «Фамилия» и «Сумма» и структуру OtherPerson с такими же полями:
class Person
{ string Fio; double Summa: };
struct OtherPerson
{ string Fio; double Summa; };
Теперь определим переменные с инициализацией:
Person Kupaev = { "Купаев М.", 10000.90 }; // ошибка!
OtherPerson Laptev = { "Лаптев В.", 20000.00 };
В первом случае мы получим ошибку при компиляции. Более того, попробуем объявить следующую переменную без инициализации:
Person Kupaev;
Тогда оперировать полями, используя запись Kupaev. Summa или Kupaev .Fio, тоже будет невозможно — компилятор выдаст сообщение об ошибке. Можно сказать, что поля класса невидимы вне класса. Таким образом, конструкция класса скрывает информацию от внешнего мира, реализуя принцип инкапсуляции.
Но в таком случае у нас возникают проблемы: ни одна из ранее определенных функций (см. листинги 1.3-1.6) работать не будет! Однако совершенно очевидно, что операции, выполняющие обработку значений нашего типа данных, должны иметь доступ к внутренней структуре класса. Чтобы это стало возможно, наши функции, выполняющие операции с денежными суммами, нужно поместить внутрь определения класса. Таким образом, функции не только получают доступ к внутренней структуре класса, но и явно связываются с типом данных. |