Теоретический материал
Перегрузка операторов — в программировании — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов применения оператора, имеющих одно и то же имя, но различающихся типами параметров, к которым они применяются.
Перегрузка операций предполагает введение в язык двух взаимосвязанных особенностей: возможности объявлять в одной области видимости несколько процедур или функций с одинаковыми именами и возможности описывать собственные реализации бинарных операторов (то есть знаков операций, обычно записываемых в инфиксной нотации, между операндами). Принципиально реализация их достаточно проста:
· Чтобы разрешить существование нескольких одноимённых операций, достаточно ввести в язык правило, согласно которому операция (процедура, функция или оператор) опознаются компилятором не только по имени (обозначению), но и по типам их параметров. Таким образом, abs(i), где i объявлено как целое, и abs(x), где x объявлено как вещественное — это две разные операции. Принципиально в обеспечении именно такой трактовки нет никаких сложностей.
· Чтобы дать возможность определять и переопределять операции, необходимо ввести в язык соответствующие синтаксические конструкции. Вариантов их может быть достаточно много, но по сути они ничем друг от друга не отличаются, достаточно помнить, что запись вида «<операнд1> <знакОперации> <операнд2>» принципиально аналогична вызову функции «<знакОперации>(<операнд1>,<операнд2>)».
Индивидуальное задание №1
Задание: (конструктор копирования и оператор присваивания). Создать иерархию классов человек и служащий. Переопределить вывод в поток и ввод из потока, конструктор копирования, оператор присваивания через соответствующие функции базового класса.
Диаграмма классов
Описание
Класс Human:
Поля класса:
· name_ – имя человека
· surname_ – фамилия
· gender_ – пол
Методы класса:
· set-методы: set_name, set_surname, set_genderB, set_genderL
· get-методы: get_name, get_surname, get_gender
· del_name – очистка памяти, выделяемой под строки имени и фамилии
Класс employee – наследник класса Human:
Поля класса:
· company_ – рабочая компания
· employment_duration – длительность работы (лет)
Методы класса:
· set-методы: set_company, set_duration
· get-методы: get_company, get_duration
· operator= – перегруженный оператор присваивания
· operator<<, operator>> - перегруженные операторы вывода и ввода в поток (друзья)
Исходный код
Human.h
#pragma once
#include "stdio.h"
#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
class Human
{
private:
char* name_; char* surname_; bool gender_;
public:
Human();
Human(char* Name, char* Sur, bool M_W);
void set_name (char* Name);
void set_surname (char* Sur);
void set_genderL (char & G);
void set_genderB (bool F);
void del_name();
~Human();
char* get_surname() const;
char* get_name() const;
bool get_gender() const;
};
Human.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Human.h"
Human::Human()
{
name_=(char*) calloc(1, sizeof(char*));
surname_=(char*) calloc(1, sizeof(char*));
};
Human::Human(char* Name, char* Sur, bool M_W)
{
name_=(char*) calloc (1+strlen(Name), sizeof(char*));
strcpy(name_, Name);
surname_=(char*) calloc (1+strlen(Sur), sizeof(char*));
strcpy(surname_, Sur);
gender_=M_W;
};
void Human::set_name (char* Name)
{
name_=(char*) realloc (name_, (1+strlen(Name))*sizeof(char*));
strcpy(name_, Name);
};
char* Human::get_name() const
{
return name_;
};
void Human::del_name()
{
free(name_);
free(surname_);
};
Human::~Human()
{
del_name();
}
void Human::set_surname (char* Sur)
{
surname_=(char*) realloc (surname_, (1+strlen(Sur))*sizeof(char*));
strcpy(surname_, Sur);
};
char* Human::get_surname() const
{
return surname_;
};
void Human::set_genderL(char& G)
{
if (G==77) gender_=true;
else gender_=false;
};
void Human::set_genderB(bool F) const
{
gender_=F;
};
bool Human::get_gender() const
{
return gender_;
};
Employee.h
#pragma once
#include "Human.h"
class employee:
public Human
{
friend ostream &operator<<(ostream & os, const employee &entry);
friend istream &operator>>(istream & os, employee &entry);
private:
char* company_;
int employment_duration;
public:
employee();
employee (char* company, int duration, char* Name, char* Sur, bool M_W);
employee (const employee & entry);
void set_company (char* Name);
char* get_company() const;
~employee();
void set_duration (int & prolong);
int get_duration() const;
employee & operator=(const employee & st);
};
Employee.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "employee.h"
using namespace std;
employee::employee()
:Human()
{
company_=(char*) calloc(1, sizeof(char*));
};
employee::employee (char* company, int duration, char* Name, char* Sur, bool M_W)
: Human (Name, Sur, M_W)
{
employment_duration=duration;
company_=(char*) calloc (1+strlen(company), sizeof(char*));
strcpy(company_, company);
};
employee::employee (const employee & entry)
{
employment_duration=entry.employment_duration;
company_=(char*) realloc (company_, (1+strlen(entry.company_))*sizeof(char*));
strcpy(company_, entry.company_);
set_name(entry.get_name());
set_surname(entry.get_surname());
set_genderB(entry.get_gender());
};
void employee::set_company (char* Name)
{
company_=(char*) realloc (company_, (1+strlen(Name))*sizeof(char*));
strcpy(company_, Name);
};
char* employee::get_company() const
{
return company_;
};
employee::~employee()
{
free(company_);
del_name();
};
void employee::set_duration (int & prolong)
{
employment_duration=prolong;
};
int employee::get_duration() const
{
return employment_duration;
};
ostream &operator<<(ostream & os, const employee &entry)
{
os<<"Name: "<<entry.get_name()<<" "<<entry.get_surname()<<endl;
return os;
};
istream &operator>>(istream & os, employee &entry)
{
char A,B;
os>>A>>B>>entry.company_;
entry.set_name(&A);
entry.set_surname(&B);
return os;
};
employee & employee::operator=(const employee & st)
{
if (this==&st)
return *this;
company_=(char*) realloc (company_, (1+strlen(st.get_company()))*sizeof(char*));
strcpy(company_, st.get_company());
employment_duration=st.get_duration();
set_name(st.get_name());
set_surname(st.get_surname());
set_genderB(st.get_gender());
return *this;
};
Пример программы с использованием созданных классов
#include "employee.h"
int main()
{
employee man("Apple", 4, "Biggie", "Jefferson", true);
employee man_0;
man_0=man;
cout<<man_0;
system("PAUSE");
return 0;
}