Лекция №2. Основы объектно-ориентиро- ванного программирования с точки зрения разработчиков классов Описание класса Описание методов класса Обращение к свойствам и методам «изнутри» Управление доступом к свойствам и методам клас- са Специальные методы класса: конструкторы и де- структоры Константные объекты и методы 1
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Лекция №2. Основы объектно-ориентиро-ванного программирования с точки зрения
разработчиков классов
Описание класса Описание методов классаОбращение к свойствам и методам «изнутри»Управление доступом к свойствам и методам клас-саСпециальные методы класса: конструкторы и де-структорыКонстантные объекты и методы1
Описание класса
● Перед использованием класс должен быть описан:
classclass <имя класса> <имя класса> { { <описание членов класса> <описание членов класса> };};
● Членами класса являются его свойства и методы
2
Описание свойств класса
● Свойства класса описываются таким же образом как и поля структуры:
<тип> <имя>;<тип> <имя>;
3
Задание
Опишите класс Fraction - «несократимая дробь», свойствами которого являются:● fNumerator - числитель, целое число;● fDenominator - знаменатель, целое число.
4
Описание свойств класса
// Несокртаимая дробьclass Fraction{ int fNumerator; // числитель int fDenominator; // знаменатель.......};
5
Описание методов класса
● Метод класса описывается либо полностью (вме-сте с телом), либо задается только его прототип
● Полное описание метода:<тип возвращаемого значения> <тип возвращаемого значения>
● Можно ограничить доступ к отдельным свойствам и методам класса
● Это позволяет защитить данные и методы от не-правильного и несанкционированного использова-ния
● Это позволяет скрыть детали реализации класса, что дает возможность разрабатывать класс, не за-трагивая остальные компоненты программы
16
Пример неверного использования свойств класса
class Fraction // Несократимая дробь{ int fNumerator; // числитель int fDenominator; // знаменатель
// Возвращает дробь как вещественное число double toDouble() { return (double)fNumerator/fDenominator; }};
void main(void){ Fraction fr; fr.fNumerator = 1; fr.fDenominator = 0; double result = fr.toDouble(); // возникнет ошибка // исполнения программы}17
Способ устранения неверного использования свойств класса
class Fraction // Несократимая дробь{ // Сделать числитель и знаменатель недоступными.... // Метод для задания числителя void setNumerator(int n) { fNumerator = n; } // Метод для задания знаменателя bool setDenominator(int d) { if(d == 0) { fDenominator = 1; return false; } else { fDenominator = d; return true; } }};18
Способ устранения неверного использования свойств класса
void main(void){ Fraction fr; fr.setNumerator(1); fr.setDenominator(0); double result = fr.toDouble(); // ошибки не будет}
19
Уровни доступа
public (общедоступный)
члены класса доступны во всей программе
private(закрытый)
члены класса доступны только для методов этого класса
protected(защищенный)
члены класса доступны только для методов производных классов
20
Для ограничения доступа используются специфика-торы доступа public, protected и private
Описание класса с указанием уровней доступа
classclass <имя класса> <имя класса>
{ {
publicpublic:: <описание членов класса> <описание членов класса>
protectedprotected:: <описание членов класса> <описание членов класса>
privateprivate:: <описание членов класса> <описание членов класса> };};
21
Задание
● В описании класса Fraction («дробь») укажите уровни доступа, если все свойства являются закрытыми, а методы – открытыми
class Fraction // Несокртаимая дробь{ int fNumerator; // числитель int fDenominator; // знаменатель
// Возвращает дробь как вещественное число double toDouble(); // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d);};22
Задание уровней доступа
class Fraction // Несокртаимая дробь{ public: // Возвращает дробь как вещественное число double toDouble(); // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d); private: int fNumerator; // числитель int fDenominator; // знаменатель};
23
Задание
● В функции main() создайте дробь 23/15 и преобразуйте ее к вещественному числу. Результат присвойте переменной result
24
Обращение к свойствам и методам с учетом уровней доступа
void main(void)
{
Fraction fr;
fr.setNumerator(23); fr.setDenominator(15);
// Напрямую обращаться к свойствам класса запрещено // fr.fNumerator = 23; // fr.fDenominator = 15;
double result = fr.toDouble(); // result = 1.5333}25
Константные объекты и методы
● Объект может быть объявлен константным:const Fracrion constFr(3, 5);
● Нельзя менять значения свойств константного объекта. Следовательно, константному объекту не-льзя присвоить другой объект
● Применительно к константному объекту можно применять только константные методы
● Метод класса считается константным, если после заголовка метода стоит ключевое слово const и он не меняет свойства класса26
Задание
Дан класс
class Fraction // Несокртаимая дробь{ public: // Сравнение двух дробей bool isEqual(const Fraction &other) const; // Возвращает дробь как вещественное число double toDouble() const; // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d);.....};27
Задание
Найдите ошибки в следующем фрагменте кода
Fraction fr1(2, 4);const Fraction fr2(1, 3);
double n = fr2.toDouble();double m = fr1.toDouble();
fr1.setNumerator(10);fr2.setDenominator(9);
fr2 = fr1; fr1 = fr2;
28
Константные объекты и методы
Fraction fr1(2, 4);const Fraction fr2(1, 3);
double n = fr2.toDouble();double m = fr1.toDouble();
fr1.setNumerator(10);fr2.setDenominator(9); /* ОШИБКА: Вызов неконстантной функции для константного объекта*/
fr2 = fr1; /*ОШИБКА: попытка присвоить константному объекту другой объект*/