Лекция 10. Введение в ООП. Часть 3 Красс Александр Alexander.Krass@gmail.com СПбГУ ИТМО, 2008.

Презентация:



Advertisements
Похожие презентации
Лекция 11. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Advertisements

Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Лекция 9. Введение в ООП. Часть 2 Красс Александр СПбГУ ИТМО, 2008.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 7 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Лекция 3. Одномерные массивы, указатели и ссылки Красс Александр СПбГУ ИТМО, 2008.
Лекция 9 Приведение типов. Классификация типов Типы С++ Пользовательские Встроенные (Фундаментальные) Адресные Арифтметические void Указатели Ссылки Массивы.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
Лекция 31. Динамическая информация о типе Красс Александр СПбГУ ИТМО, 2009.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Лекция 21. Шаблоны (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Транксрипт:

Лекция 10. Введение в ООП. Часть 3 Красс Александр СПбГУ ИТМО, 2008

2 Темы Члены класса Списки инициализации Перегрузка функций

3 Повторение. Простая реализация class String { public: String(const char *str) { data_ = new char[strlen(str) + 1]; strcpy(data_, str); } void Add(const char *str) {... } private: char *data_; };... String str1(AAA);

4 Члены класса Пусть класс X содержит член y типа Y. Тогда y может быть объявлен тремя способами: –Y y; // Как объект –Y &y; // Как ссылка –Y *y; // Как указатель

5 Члены класса Желательно использовать член класса типа объект, поскольку это самый простой способ. Используйте указатель, если … –Вам нужен массив объектов –Вам нужно ссылаться на внешний объект Используйте ссылки если … –Вам нужно ссылаться на внешний объект

6 Списки инициализации class Person { const char *firstName_; const char *lastName_; int dayOfBirth_; public: Person(const char *firstName, const char *lastName, int dayOfBirth); const char* GetFirstName(); const char* GetLastName(); int GetDayOfBirth(); };

7 Списки инициализации Person::Person(const char *firstName, const char *lastName, int dayOfBirth) { firstName_ = firstName; lastName_ = lastName; dayOfBirth_ = dayOfBirth; }

8 Списки инициализации Person::Person(const char *firstName, // Обычный const char *lastName, int dayOfBirth) // способ { firstName_ = firstName; // Работать не будет, lastName_ = lastName; // т.к. const char * dayOfBirth_ = dayOfBirth; } Person::Person(const char *firstName, const char *lastName, int dayOfBirth) : firstName_(firstName), lastName_(lastName), dayOfBirth_(dayOfBirth) // Список инициализации { }

9 Списки инициализации Какой способ лучше? –Для встроенных типов (int, char) разницы нет. –Для пользовательских типов списки инициализации предпочтительнее При инициализации присваиванием (в конструкторе) для них сначала будет вызван конструктор по умолчанию, а потом оператор присваивания. При инициализации списком будет вызван только конструктор, подходящий для указанного аргумента.

10 Списки инициализации struct A { int i; A(); A(int k); }; A::A() : i(-1) {} A::A(int k) : i(k) {} struct B { A b, a; int j, k; B(); }; B::B() : a(1), b(a.i + 1), j(a.i), k(j + A().i) { cout << a.i << endl; cout << b.i << endl; cout << j << endl; cout << k << endl; } void main() // Что мы должны { // увидеть на B b; // экране? }

11 Списки инициализации struct A { int i; A(); A(int k); }; A::A() : i(-1) {} A::A(int k) : i(k) {} struct B { A b, a; int j, k; B(); }; B::B() : a(1), b(a.i + 1), j(a.i), k(j + A().i) { cout << a.i << endl; cout << b.i << endl; cout << j << endl; cout << k << endl; } void main() // 1 { // мусор B b; // 1 } // 0

12 Списки инициализации При использовании списка инициализации члены класса инициализируются в порядке определения в классе, а не в порядке перечисления в списке!

13 Списки инициализации Для каких полей класса не избежать применения списков инициализации: для членов класса, чьи пользовательские типы не имеют конструкторов по умолчанию. для константных членов класса (const int). для ссылки (char &).

14 Итого Списки инициализации предпочтительнее инициализации в конструкторе (присваивания). В списке инициализации перечисляйте члены класса в порядке их объявления в классе. Используйте списки инициализации даже для встроенных типов (порядка ради). Не бойтесь пустых тел конструкторов, возникающих из-за списков инициализации.

15 Сигнатура функции Сигнатура функции – список типов параметров функции Примеры: –int f1 (int, double); –int f2 (int, const char*, const char*); Имена параметров не участвуют в определении сигнатуры, поэтому мы их указывать не будем. Модификатор const изменяет сигнатуру функции. Тип возвращаемого значения не влияет на сигнатуру

16 Перегрузка функций Функции в одной области видимости могут иметь одно и тоже имя, но разную сигнатуру. В этом случае говорят, что функции перегружены. Пример: –int Max (int, int); –int Max (const int*, int); Каждая из этих функций будет реализована отдельно (по своим алгоритмам), но с точки зрения пользователя, существует только одна функция.

17 Перегрузка функций Жизнь без перегрузки функций была бы тяжелой: –int IntMax (int, int); –int IntArrayMax (const int*, int); –int IntArraysMax (const int*, const int*);

18 Перегрузка функций Как компилятор понимает, какую функцию надо вызвать? –Он может попытаться найти функцию, сигнатура которой точно соответствует передаваемым параметрам. –Он может попытаться применить неявные преобразования, используя конструкторы и перегруженные операторы преобразования типов. В любом случае, для того, чтобы перегрузка работала, сигнатуры функций должны существенно различаться: –int f (int); –int f (int&); // Ошибка!

19 Перегрузка функций Функции могут различаться по их константности. Рассмотрим функцию at из класса Array: –int& at(int index); –const int& at(int index) const; Функции не могут различаться только типом возвращаемого значения! –int f (int); –double f (int); // Ошибка!

20 Спасибо за внимание Вопросы?