2 osnovy oop dlja razrabotchika

Post on 13-Apr-2015

57 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

tai lieu tham khao QT

TRANSCRIPT

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

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

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

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

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

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

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

2

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

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

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

3

Задание

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

4

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

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

5

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

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

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

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

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

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

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

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

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

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

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

7

Задание

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

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

8

Задание

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

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

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

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

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

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

........};

10

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

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

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

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

11

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

12

Свойства: fNumerator fDenominator

Методы:

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

isEqual()

Свойства: fNumerator fDenominator

Методы:

fr2:Fraction

isEqual()

void main(void)

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

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

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

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

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

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

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

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

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

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

Задание

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

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

14

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

// Сравнение двух дробей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

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

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

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

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

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

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; /*ОШИБКА: попытка присвоить константному объекту другой объект*/

fr1 = fr2;29

top related