Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции С++.docx
Скачиваний:
8
Добавлен:
22.09.2019
Размер:
6.95 Mб
Скачать

Объектно-ориентированное

программирование

с использованием C++

Полевой Дмитрий Валерьевич к.т.н., доцент КиК

e-mail: oop.misis@gmail.com

Ссылка (reference)

  • альтернативное имя переменной

  • инициализируется при объявлении

пример:

T var(0);

T& ref(var);

18.02.2012

cppNewb.ru 2

Объявление функции

  • тип возвращаемого значения

  • имя функции

  • список аргументов

    • тип

    • имя

пример:

int swap(const int lhs, const int rhs);

18.02.2012

cppNewb.ru 3

Определение функции

  • объявление в котором присутствует тело

  • типы аргументов объявления и определения должны совпадать

  • рекомендуется поддерживать соответствие имен аргументов (могут не совпадать)

18.02.2012

cppNewb.ru 4

Определение функции

пример:

int min(const int lhs, const int rhs)

{

return (lhs < rhs )? lhs: rhs;

}

int maxTr(const int lhs, const int rhs,

cosnt int)

{

return (lhs > rhs )? lhs: rhs;

}

18.02.2012

cppNewb.ru 5

Передача аргументов

по значению

по ссылке

*

через указатель

(по значению)

пример:

int min(int lhs, int rhs)

{

return (lhs < rhs )? lhs: rhs;

}

18.02.2012

cppNewb.ru 6

Аргумент ссылка

пример:

void swap(int& lhs, int& rhs)

{

int newLhs(rhs);

rhs

=

lhs;

lhs

=

newLhs;

}

18.02.2012

cppNewb.ru 7

Возвращаемое значение

  • задается инструкцией return

  • должно быть, если не void

  • неименованная временная переменная

пример:

void empty()

{

return;

}

18.02.2012

пример:

int empty()

{

int res(0);

// …

return res;

cppNew}b.ru 8

Терминология (класс, экземпляр)

  • класс – пользовательский тип

  • экземпляр – объект (область памяти)

18.02.2012

cppNewb.ru 9

Данные и методы

  • данные – переменные

  • методы – функции

18.02.2012

cppNewb.ru 10

Доступ к членам

  • . – оператор доступа к члену

  • -> – оператор разыменования члена структуры (для указателя на экземпляр)

Address myAddress;

Address* pAddress = &myAddress;

myAddress.zip() pAddress->zip() (*pAddress).zip()

18.02.2012

cppNewb.ru 11

  • public

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

    • открытые члены, имена доступны везде

  • private

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

  • protected

    • защищенные члены, имена доступны только в собственных функциях и функциях-членах производных классов

18.02.2012

cppNewb.ru 12

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

class ClassName

{

};

18.02.2012

public:

// открытые методы

private:

// закрытые методы

private:

// закрытые данные

cppNewb.ru 13

Пример (точка)

пример:

class Point

{

public:

// методы

private:

int

m_x;

//<

x-координата

int

m_y;

//<

y-координата

};

18.02.2012

cppNewb.ru 14

Конструктор

  • имя функции совпадает с именем класса

  • не возвращает значений

  • создает экземпляр (инициализирует)

18.02.2012

cppNewb.ru 15

Конструктор (пример)

пример:

class Point

{

public:

Point(const int x, const int y);

};

18.02.2012

cppNewb.ru 16

Инициализация данных

  • сконструированный объект д.б.

инициализирован

пример:

Point::Point(const int x, const int y)

: m_x(x)

, m_y(y)

{

}

18.02.2012

cppNewb.ru 17

Порядок инициализации

  • определяется порядком объявления переменных в классе

  • не зависит от порядка в списке инициализации

  • инициализируйте переменные в порядке объявления

18.02.2012

cppNewb.ru 18

Перегрузка функций

  • использование одного имени для операция с разными типами

пример:

int min(const int lhs, const int rhs);

double

min(const

double

lhs,

const

double

rhs);

18.02.2012

cppNewb.ru 19

Поиск соответствия (функция)

  • точное соответствие типов аргументов

  • соответствие после “повышения”

интегральных типов (bool→int и т.д.)

  • соответствие после стандартных преобразований типов (int→double и т.д.)

  • соответствие после пользовательских преобразований типов

  • соответствие за счет многоточий в объявлении функции (…)

18.02.2012

cppNewb.ru 20

Перегрузка методов

  • аналогично перегрузке функций

18.02.2012

cppNewb.ru 21

Перегрузка конструктора

пример:

class Point

{

public:

Point(const int x, const int y); Point(const Point& point);

};

18.02.2012

cppNewb.ru 22

Деструктор

  • имя функции строиться из имени класса

  • не принимает аргументов

  • не возвращает значений

  • разрушает экземпляр

18.02.2012

cppNewb.ru 23

пример:

Деструктор (пример)

// В cpoint.h class CPoint

{

public:

~CPoint();

};

// В cpoint.cpp CPoint::~CPoint()

{

}

18.02.2012

cppNewb.ru 24

Форма записи выражений

  • традиционная форма

a + b

  • префиксная форма

+ a b

пример:

a + b

operator+(a, b)

18.02.2012

cppNewb.ru 25

Операторная функция

  • имя начинается с ключевого слова operator, после которого идет сам оператор

пример: operator+ operator++

  • объявление соответствует грамматике языка (количество и состав аргументов)

18.02.2012

cppNewb.ru 26

Перегрузка операторов

  • функция-член (внутренняя)

пример:

T operator@(const T& rhs)

  • функция-не-член (внешняя)

пример:

T operator@(const T& lhs, const T& rhs)

18.02.2012

cppNewb.ru 27

Приоритет операторов

  • приоритет

операторов

определен

в

стандарте

языка

  • приоритет операторов не может быть

изменен

18.02.2012

cppNewb.ru 28

Унарный оператор

  • выражение @aa или aa@

  • нестатическая функция-член без аргументов

aa.operator@()

  • функция-не-член с одним аргументом

operator@(aa)

18.02.2012

cppNewb.ru 29

Префиксная и постфиксная

формы унарных операторов

  • префиксный оператор @aa

    • возвращает результат вычисления

пример:

++a

  • постфиксный оператор aa@

    • возвращает исходное значение аргумента

пример:

a++

18.02.2012

cppNewb.ru 30

Префиксные и постфиксные операторы (сигнатуры)

  • префиксный оператор

T& operator++() T& operator--()

  • постфиксный оператор

T operator++(int)

T operator--(int)

18.02.2012

cppNewb.ru 31

Префиксный унарный оператор

(пример)

T& T::operator++()

{

// содержательная работа

return *this;

}

18.02.2012

cppNewb.ru 32

Постфиксный унарный оператор

(пример)

T T::operator++(int)

{

T initValue(*this)

++(*this);

return initValue;

}

18.02.2012

cppNewb.ru 33

Бинарный оператор

  • выражение aa @ bb

  • нестатическая функция-член с одним аргументом

aa.operator@(bb)

  • функция-не-член с двумя аргументами

operator@(aa, bb)

18.02.2012

cppNewb.ru 34

Ограничения

  • нельзя создать “новый” оператор

  • нельзя

изменить

число аргументов

  • нельзя

изменить

приоритет

18.02.2012

cppNewb.ru 35

Предопределенный смысл

  • должен сохраняться

  • должен быть переопределен для всех вариантов операторов

пример: a++ означает a += 1 означает

a = a + 1

18.02.2012

cppNewb.ru 36

Сохранение смысла

  • для автономных версий операторов a@b всегда предоставляйте присваивающую версию @=

  • для операторов, допускающих перестановку аргументов, предоставляйте все соответствующие версии

18.02.2012

cppNewb.ru 37

Принцип минимальности интерфейса

  • минимизируйте число функций, непосредственно манипулирующих представлением объекта

  • объявляйте в классе только те операторы, которые модифицируют значение первого аргумента

18.02.2012

cppNewb.ru 38

Минимальность интерфейса

(пример)

  • в классе

T& operator+=(const T& rhs)

  • вне класса

T operator+(const T& lhs, const T& rhs)

{

T sum(lhs); sum += rhs; return sum;

}

18.02.2012

cppNewb.ru 39

Перегрузка операторов

(рекомендации)

  • перегружайте умеренно и осмысленно

  • используйте операторы для имитации привычной формы записи

  • минимизируйте число функций,

имеющих доступ к внутреннему

представлению

класса

  • минимизируйте объектов

создание временных

18.02.2012

cppNewb.ru

40

Перегрузка операторов

(рекомендации)

  • обеспечивайте полный набор перегруженных операторов

  • минимизируйте количество независимых операторов

пример:

operator==

operator!= – реализовать через operator==

18.02.2012

cppNewb.ru 41

Смешанная арифметика

RatN val(0); /// rational number

2 + val; val + 2;

требует наличия операторов

RatN operator+(const СRatN&, int); RatN operator+(int, const СRatN&);

18.02.2012

cppNewb.ru 42

Потоковый ввод и вывод

Point center(0, 0); cout << center;

приводит к вызову

operator<<(cout, center)

18.02.2012

cppNewb.ru 43

Классы ввода/вывода

  • ostream

    • поток вывода (класс)

    • глобальные объекты cout, cerr, clog

  • istream

    • поток ввода (класс)

    • глобальный объект cin

18.02.2012

cppNewb.ru 44

Проблема перегрузки операций ввода и вывода

  • левым аргументом является экземпляр класса стандартной библиотеки

  • модификация класса левого аргумента невозможна или нежелательна

18.02.2012

cppNewb.ru 45

Перегрузка ввода/вывода

  • вывод

ostream&

operator<<(ostream&,

T)

или

ostream&

operator<<(ostream&,

const

T&)

  • ввод

istream& operator>>(istream&, T&)

18.02.2012

cppNewb.ru 46