2 osnovy oop dlja razrabotchika

29
Лекция №2. Основы объектно-ориентиро- ванного программирования с точки зрения разработчиков классов Описание класса Описание методов класса Обращение к свойствам и методам «изнутри» Управление доступом к свойствам и методам клас- са Специальные методы класса: конструкторы и де- структоры Константные объекты и методы 1

Upload: juno-nguyen

Post on 13-Apr-2015

57 views

Category:

Documents


1 download

DESCRIPTION

tai lieu tham khao QT

TRANSCRIPT

Page 1: 2 Osnovy OOP Dlja Razrabotchika

Лекция №2. Основы объектно-ориентиро-ванного программирования с точки зрения

разработчиков классов

Описание класса Описание методов классаОбращение к свойствам и методам «изнутри»Управление доступом к свойствам и методам клас-саСпециальные методы класса: конструкторы и де-структорыКонстантные объекты и методы1

Page 2: 2 Osnovy OOP Dlja Razrabotchika

Описание класса

● Перед использованием класс должен быть описан:

classclass <имя класса> <имя класса> { { <описание членов класса> <описание членов класса> };};

● Членами класса являются его свойства и методы

2

Page 3: 2 Osnovy OOP Dlja Razrabotchika

Описание свойств класса

● Свойства класса описываются таким же образом как и поля структуры:

<тип> <имя>;<тип> <имя>;

3

Page 4: 2 Osnovy OOP Dlja Razrabotchika

Задание

Опишите класс Fraction - «несократимая дробь», свойствами которого являются:● fNumerator - числитель, целое число;● fDenominator - знаменатель, целое число.

4

Page 5: 2 Osnovy OOP Dlja Razrabotchika

Описание свойств класса

// Несокртаимая дробьclass Fraction{ int fNumerator; // числитель int fDenominator; // знаменатель.......};

5

Page 6: 2 Osnovy OOP Dlja Razrabotchika

Описание методов класса

● Метод класса описывается либо полностью (вме-сте с телом), либо задается только его прототип

● Полное описание метода:<тип возвращаемого значения> <тип возвращаемого значения>

<имя метода>(<аргументы>)<имя метода>(<аргументы>){{ <тело метода><тело метода>}}

● Предварительное описание метода:<тип возвращаемого значения> <тип возвращаемого значения>

<имя метода>(<аргументы>);<имя метода>(<аргументы>);6

Page 7: 2 Osnovy OOP Dlja Razrabotchika

Описание методов класса

● Если метод определен предварительно (через прототип), то в дальнейшем он должен быть до-определен вне описания класса

● При этом описание метода выглядит следующим образом:

<тип возвращаемого значения> <тип возвращаемого значения> <имя класса>::<имя класса>::<имя метода>(<аргументы>)<имя метода>(<аргументы>)

{{ <тело метода><тело метода>}}

7

Page 8: 2 Osnovy OOP Dlja Razrabotchika

Задание

● Дайте предварительное описание следующего ме-тода класса Fraction («дробь»):

– isEqual - сравнение двух дробей, как результат:● true - дроби равны● false - дроби не равны

8

Page 9: 2 Osnovy OOP Dlja Razrabotchika

Задание

● Метод должен обеспечивать следующие возмож-ности:Fraction fr1(1, 2); // дробь 1/2Fraction fr2(4, 3); // дробь 4/3

// Метод isEqual() - динамический, следовательно// при вызове метода необходимо указать дробь,// которая будет выполнять этот метод.

// В методе всего один аргумент (типа "дробь"),// т.к. левым операндом является дробь-исполнитель

bool result = fr1.isEqual(fr2); /* дробь fr1 сравнивает себя с дробью fr2 и как результат возвращает true или false */9

Page 10: 2 Osnovy OOP Dlja Razrabotchika

Описание методов класса

// Несокртаимая дробьclass Fraction{ int fNumerator; // числитель int fDenominator; // знаменатель // Сравнение двух дробей bool isEqual(const Fraction &other);

........};

10

Page 11: 2 Osnovy OOP Dlja Razrabotchika

«Внутри» и «вовне» класса

● С точки зрения класса весь код программы разде-лен на внутренний и внешний

● Внутренним является код функций, принадлежа-щих классу, внешним — остальной код

● Обращение к элементам (свойствам и методам) класса изнутри и извне различно

11

Page 12: 2 Osnovy OOP Dlja Razrabotchika

«Внутри» и «вовне» класса

12

Свойства: fNumerator fDenominator

Методы:

fr1:Fraction(объект-исполнитель)

isEqual()

Свойства: fNumerator fDenominator

Методы:

fr2:Fraction

isEqual()

void main(void)

обращение к собственному

свойству(изнутри)

обращение к свойству

другого объекта(снаружи)

обращение кметоду из внешнейфункции(снаружи)

Page 13: 2 Osnovy OOP Dlja Razrabotchika

Обращение к элементам класса

● Обращение к свойствам и методам класса снаружи производится с указанием объекта и операторов доступа . (точка) или-> (стрелка):

<объект>.<объект>.<имя свойства><имя свойства><объект>.<объект>.<имя метода>(<аргументы>)<имя метода>(<аргументы>)

● Обращение к собственным свойствам и методам внутри класса происходит без указания объекта, т.к. подразумевается объект-исполнитель:

<имя свойства><имя свойства><имя метода>(<аргументы>)<имя метода>(<аргументы>)13

Page 14: 2 Osnovy OOP Dlja Razrabotchika

Задание

● Определите метод isEqual (сравнение двух дро-бей) вне описания класса

● Так как дробь несократимая, то равенство двух дро-бей выполняется при условии равенства их числи-телей и знаменателей

14

Page 15: 2 Osnovy OOP Dlja Razrabotchika

Пример обращения к методам класса изнутри и снаружи

// Сравнение двух дробейbool Fraction::isEqual(const Fraction &other){ return ( fNumerator == other.fNumerator ) && ( fDenominator == other.fDenominator );}

void main(void){ Fraction fr(1, 2), fr2(3, 7); bool result = fr.isEqual(fr2);}

обращение к собственному

свойству (изнутри)

обращение к методу из внешней функции

(снаружи)15

обращение к свойству другогообъекта (снаружи)

Page 16: 2 Osnovy OOP Dlja Razrabotchika

Управление доступом к свойствам и методам класса

● Можно ограничить доступ к отдельным свойствам и методам класса

● Это позволяет защитить данные и методы от не-правильного и несанкционированного использова-ния

● Это позволяет скрыть детали реализации класса, что дает возможность разрабатывать класс, не за-трагивая остальные компоненты программы

16

Page 17: 2 Osnovy OOP Dlja Razrabotchika

Пример неверного использования свойств класса

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

Page 18: 2 Osnovy OOP Dlja Razrabotchika

Способ устранения неверного использования свойств класса

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

Page 19: 2 Osnovy OOP Dlja Razrabotchika

Способ устранения неверного использования свойств класса

void main(void){ Fraction fr; fr.setNumerator(1); fr.setDenominator(0); double result = fr.toDouble(); // ошибки не будет}

19

Page 20: 2 Osnovy OOP Dlja Razrabotchika

Уровни доступа

public (общедоступный)

члены класса доступны во всей программе

private(закрытый)

члены класса доступны только для методов этого класса

protected(защищенный)

члены класса доступны только для методов производных классов

20

Для ограничения доступа используются специфика-торы доступа public, protected и private

Page 21: 2 Osnovy OOP Dlja Razrabotchika

Описание класса с указанием уровней доступа

classclass <имя класса> <имя класса>

{ {

publicpublic:: <описание членов класса> <описание членов класса>

protectedprotected:: <описание членов класса> <описание членов класса>

privateprivate:: <описание членов класса> <описание членов класса> };};

21

Page 22: 2 Osnovy OOP Dlja Razrabotchika

Задание

● В описании класса Fraction («дробь») укажите уровни доступа, если все свойства являются закрытыми, а методы – открытыми

class Fraction // Несокртаимая дробь{ int fNumerator; // числитель int fDenominator; // знаменатель

// Возвращает дробь как вещественное число double toDouble(); // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d);};22

Page 23: 2 Osnovy OOP Dlja Razrabotchika

Задание уровней доступа

class Fraction // Несокртаимая дробь{ public: // Возвращает дробь как вещественное число double toDouble(); // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d); private: int fNumerator; // числитель int fDenominator; // знаменатель};

23

Page 24: 2 Osnovy OOP Dlja Razrabotchika

Задание

● В функции main() создайте дробь 23/15 и преобразуйте ее к вещественному числу. Результат присвойте переменной result

24

Page 25: 2 Osnovy OOP Dlja Razrabotchika

Обращение к свойствам и методам с учетом уровней доступа

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

Page 26: 2 Osnovy OOP Dlja Razrabotchika

Константные объекты и методы

● Объект может быть объявлен константным:const Fracrion constFr(3, 5);

● Нельзя менять значения свойств константного объекта. Следовательно, константному объекту не-льзя присвоить другой объект

● Применительно к константному объекту можно применять только константные методы

● Метод класса считается константным, если после заголовка метода стоит ключевое слово const и он не меняет свойства класса26

Page 27: 2 Osnovy OOP Dlja Razrabotchika

Задание

Дан класс

class Fraction // Несокртаимая дробь{ public: // Сравнение двух дробей bool isEqual(const Fraction &other) const; // Возвращает дробь как вещественное число double toDouble() const; // Метод для задания числителя void setNumerator(int n); // Метод для задания знаменателя bool setDenominator(int d);.....};27

Page 28: 2 Osnovy OOP Dlja Razrabotchika

Задание

Найдите ошибки в следующем фрагменте кода

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

Page 29: 2 Osnovy OOP Dlja Razrabotchika

Константные объекты и методы

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;29