
- •Примеры
- •Примеры
- •[Править]в объектно-ориентированных языках
- •Параметрический полиморфизм
- •[Править]Специальный полиморфизм
- •[Править]Неявная типизация
- •Статический и динамический полиморфизм
- •Полиморфизм включения
- •Параметрический полиморфизм
- •Полиморфизм переопределения
- •Полиморфизм-перегрузка
- •Сравнение полиморфизма в функциональном и объектно-ориентированном программировании
- •Определение методов класса вне класса
- •Второй пример
- •Что вам необходимо знать
- •25. Inline Функции
- •26. Указатель this
- •27. Селекторы
- •5.1 Сопоставление шаблонов
- •5.2 Синтаксис селекторов
- •5.2.1 Группировка
- •5.3 Универсальный селектор
- •5.4 Селекторы типов
- •5.5 Селекторы потомков
- •5.6 Селекторы дочерних элементов
- •5.7 Селекторы сестринских элементов
- •5.8 Селекторы атрибутов
- •5.8.1 Сопоставление атрибутам и значениям атрибутов
- •5.8.2 Значения атрибутов, используемые в dtd по умолчанию
- •5.8.3 Селекторы классов
- •28. Модификаторы
- •29. Конструкторы
- •Назначение конструктора
- •Виды конструкторов
- •Конструктор по умолчанию
- •Конструктор копирования
- •Конструктор преобразования
- •Виртуальный конструктор
- •Синтаксис
- •Пример Конструктора по умолчания
- •31. Деструкторы
- •Виртуальный деструктор
- •Создание простого конструктора
- •Конструкторы и параметры по умолчанию
- •Перегрузка конструкторов
- •Представление о деструкторе
- •Что вам необходимо знать
- •32. Друзья
- •Определение друзей класса
- •Ограничение количества друзей
- •Что вам необходимо знать
- •Совместное использование элемента данных
- •Использование элементов с атрибутами public static, еслиобъекты не существуют
- •Использование статических функций-элементов
- •Что вам необходимо знать
- •37. Перезагрузка операций
- •Перегрузка унарных операций
- •Перегрузка постфиксных операций
- •Перегрузка бинарных операций
- •38. Преобразования типов
- •Const_cast не применим:
- •39. Наследование
- •Простое наследование
- •Второй пример
- •Что такое защищенные элементы
- •Разрешение конфликта имен
- •Что вам необходимо знать
- •40. Виртуальные функции и полиморфизм Виртуальные функции
- •Перекрытие методов
- •Абстрактные классы и чистые виртуальные функции
- •Модификаторы доступа
- •Ковариантность
Конструкторы и параметры по умолчанию
Как вы уже знаете из урока 15, C++ позволяет указывать значения по умолчанию для параметров функции. Если пользователь не указывает каких-либо параметров, функция будет использовать значения по умолчанию. Конструктор не является исключением; ваша программа может указать для него значения по умолчанию так же, как и для любой другой функции. Например, следующий конструктор employee использует по умолчанию значение оклада равным 10000.0, если программа не указывает оклад при создании объекта. Однако программа должна указать имя служащего и его номер:
employee::employee(char *name, long employee_id, float salary = 10000.00)
{ strcpy(employee::name, name); employee::employee_id = employee_id; if (salary < 50000.0) employee::salary = salary; else // Недопустимый оклад employee::salary = 0.0; }
Перегрузка конструкторов
Как вы уже знаете из урока 13, C++ позволяет вашим программам перегружать определения функций, указывая альтернативные функции для других типов параметров. C++ позволяет вам также перегружать конструкторы. Следующая программа CONSOVER.CPP перегружает конструктор employee. Первый конструктор требует, чтобы программа указывала имя служащего, номер служащего и оклад. Второй конструктор запрашивает пользователя ввести требуемый оклад, если программа не указывает его:
employee::employee(char *name, long employee_id)
{ strcpy(employee::name, name); employee::employee_id = employee_id; do
{ cout << "Введите оклад для " << name << " меньше $50000: "; cin >> employee::salary; } while (salary >= 50000.0); }
Внутри определения класса программа должна указать прототипы для обоих конструкторов, как показано ниже:
class employee
{ public: employee (char *, long, float);|___ Прототипы перегруженных employee(char *, long); |функций void show_employee(void); int change_salary(float); long get_id(void); private: char name [64]; long employee_id; float salary; }
Ниже приведена реализация программы CONSOVER.CPP:
#include <iostream.h>
#include <string.h>
class employee
{ public: employee(char *, long, float); employee(char *, long); void show_employee(void); int change_salary(float) ; long get_id(void); private: char name [64]; long employee_id; float salary; };
employee::employee(char *name, long employee_id, float salary)
{ strcpy(employee::name, name); employee::employee_id = employee_id; if (salary < 50000.0) employee::salary = salary; else // Недопустимый оклад employee::salary = 0.0; }
employee::employee(char *name, long employee_id)
{ strcpy(employee::name, name); employee::employee_id = employee_id; do
{ cout << "Введите оклад для " << name << " меньше $50000: "; cin >> employee::salary; } while (salary >= 50000.0); }
void employee::show_employee(void)
{ cout << "Служащий: " << name << endl; cout << "Номер служащего: " << employee_id << endl; cout << "Оклад: " << salary << endl; }
void main(void)
{ employee worker("Happy Jamsa", 101, 10101.0); employee manager("Jane Doe", 102); worker.show_employee(); manager.sbow_employee(); }
Если вы откомпилируете и запустите эту программу, на вашем экране появится запрос ввести оклад для Jane Doe. Когда вы введете оклад, программа отобразит информацию об обоих служащих.