Читайте также: |
|
Как вы уже знаете из урока 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. Когда вы введете оклад, программа отобразит информацию об обоих служащих.
103.
Теперь о том, какие операторы можно, а какие - нельза перегружать. Запрещено перегружать всего 4 оператора:
:: разрешение области видимости
. выбор члена
.* выбор члена через указатель на член
?: троичный оператор
Чтобы перегрузить оператор в форме внешней функции, необходимо определить глобальную функцию. Перегруженная функция выглядит так же, как и любая глобальная функция (если не считать странного имени). Именно для таких случаев и были придуманы друзья. Если бы мы не объявили функцию operator+ другом, то она не имела бы доступа к переменной s, и мы оказались бы перед выбором: то ли разрешить всем на свете доступ к char*, то ли перейти к менее эффективной реализации, при которой строка копируется при каждом обращении к ней. С концептуальной точки зрения operator+ является частью библиотеки String, поэтому нет ничего страшного в том, чтобы объявить эту функцию другом и вручить ей ключи к внутреннему устройству String.
Внешними функциями могут перегружаться любые операторы, кроме операторов преобразования, =, [], () и -> - все эти операторы должны перегружаться только функциями класса.
Перегрузка операторов в форме функций класса
Любой оператор может быть перегружен в форме функции класса. Если оператор может перегружаться как внешней функцией, так и функцией класса, какую из двух форм выбрать? Ответ: используйте перегрузку в форме функции класса, если только у вас не найдется веских причин для перегрузки внешней функцией. Из этих причин наиболее распространены следующие:
1. Первый аргумент относится к базовому типу (например, int или double).
2. Тип первого аргумента определен в коммерческой библиотеке, которую нежелательно модифицировать.
Компилятор ищет перегрузку в форме функций класса, просматривая левую часть бинарных операторов и единственный аргумент унарных. Если ваш тип указывается справа и вы хотите воспользоваться перегрузкой в форме функции класса, вам не повезло. Самый распространенный пример перегрузки в форме внешней функции - оператор << в библиотеке ostream.
104.
Дата добавления: 2015-07-26; просмотров: 58 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ПРЕДСТАВЛЕНИЕ О ДЕСТРУКТОРЕ | | | Оператор return. Точка вызова и точка возврата |