Друзья классов

Содержание

Слайд 2

Nortel Networks Confidential

Друзья класса

Обычное объявление функции-члена гарантирует:
функция имеет доступ к закрытой части

Nortel Networks Confidential Друзья класса Обычное объявление функции-члена гарантирует: функция имеет доступ
класса
функция находится в области видимости класса
функция должна вызываться для объектов класса
Friend функция обладает только первым свойством.

Слайд 3

Nortel Networks Confidential

Друзья класса. Пример

class Coord {
int x, y, z;
//...

Nortel Networks Confidential Друзья класса. Пример class Coord { int x, y,
Coord& operator+=(const Coord&);
friend Coord operator+(Coord, Coord);
};
Coord operator+(Coord a, Coord b)
{
Coord temp;
temp.x = a.x + b.x;
temp.y = a.y + b.y;
temp.z = a.z + b.z;
return temp;
}

Использование друга
здесь неоправданно!

Слайд 4

Nortel Networks Confidential

Друзья класса. Пример-2

class Vector {
float V[4];
//...
friend Vector

Nortel Networks Confidential Друзья класса. Пример-2 class Vector { float V[4]; //...
operator*(const Matrix&, const Vector&);
};
class Matrix {
Vector M[4];
//...
friend Vector operator*(const Matrix&, const Vector&);
};
friend Vector operator*(const Matrix& rm, const Vector& rv)
{
Vector tmp;
//...
tmp.V[i] += rm.M[i].V[j] * rv.V[j];
}

Слайд 5

Nortel Networks Confidential

Классы-друзья

Все методы класса-друга являются функциями-друзьями
Классы друзья используются для отображения тесно

Nortel Networks Confidential Классы-друзья Все методы класса-друга являются функциями-друзьями Классы друзья используются
связанных концепций

class List {
friend class List_iterator;
//...
};

Слайд 6

Производные классы

Производные классы

Слайд 7

Nortel Networks Confidential

Введение

Классы используются для моделирования концепций реального и программного мира
Производные классы

Nortel Networks Confidential Введение Классы используются для моделирования концепций реального и программного
предназначены для выражения иерархических отношений, отражения общности классов

Слайд 8

Nortel Networks Confidential

Производные классы

class Employee {
public:
Employee(string _name,
string _surname);
~Employee();
void

Nortel Networks Confidential Производные классы class Employee { public: Employee(string _name, string
hire(Date d);
void fire(Date d);
string name() const;
string surname() const;
void print() const;
private:
string name, surname;
Date hire_date, fire_date;
};

class Programmer: public Employee
{
public:
Programmer(string _name,
string _surname,
string _team);
~Programmer();
void set_team (string _team);
string team() const;
void print() const;
private:
string team;
};

Слайд 9

Nortel Networks Confidential

Производные классы

name
surname
hire_date
fire_date

Employee::
name
surname
hire_date
fire_date
----
team

Programmer:

Employee:

Programmer

Employee

Employee::Employee()
Employee::~Employee()
Employee::hire()
Employee::fire()
Employee::name()
Employee::surname()
Employee::print()
Programmer::Programmer()
Programmer::~Programmer()
Programmer::set_team()
Programmer::team()
Programmer::print()
Programmer::Employee::hire()
Programmer::Employee::fire()
Programmer::Employee::name()
Programmer::Employee::surname()
Programmer::Employee::print()

Nortel Networks Confidential Производные классы name surname hire_date fire_date Employee:: name surname

Слайд 10

Nortel Networks Confidential

Производные классы

Date start_date(1,1,2004), end_date(31,12,2007);
Employee emp(“Vasya”, “Pupkin”);
emp.hire(start_date);
cout << emp.name();
cout << emp.surname();
emp.print()
emp.fire(end_date);
Programmer

Nortel Networks Confidential Производные классы Date start_date(1,1,2004), end_date(31,12,2007); Employee emp(“Vasya”, “Pupkin”); emp.hire(start_date);
prog(“Petr”, “Petrov”, “GM00”);
prog.hire(start_date);
prog.set_team(“GM12”);
cout << prog.name();
cout << prog.surname();
cout << prog.team();
prog.print();
prog.Employee::print()
prog.fire(end_date);

Слайд 11

Nortel Networks Confidential

Производные классы и указатели

Programmer *prog1 = new Programmer(“Petr”, “Petrov”, “GM12”);
Employee

Nortel Networks Confidential Производные классы и указатели Programmer *prog1 = new Programmer(“Petr”,
*emp1 = prog1;
Employee *emp2 = new Employee(“vasya”, “Pupkin”);
Programmer *prog2 = emp2;
prog2->set_team(“GM00”);
void test_function(Employee& emp);
Programmer prog3(“Ivan”, “Ivanov”, “GM00”);
test_function (prog3);

С объектом производного класса можно обращаться как с объектом базового класса при обращении к нему при помощи указателей и ссылок.

// ошибка

// нет team

// хорошо

// хорошо

Слайд 12

Nortel Networks Confidential

Функции-члены

class Employee {
string name, surname;
//...
public:
void print() const;

Nortel Networks Confidential Функции-члены class Employee { string name, surname; //... public:
string surname() const;
};
class Programmer: public Employee { //...
public:
void print() const;
//...
};

void Programmer::print() const
{
cout << surname() << endl;
}

void Programmer::print() const
{
cout << surname << endl;
}

void Programmer::print() const
{
Employee::print();
cout << team << endl;
}

// ошибка !!!

Слайд 13

Nortel Networks Confidential

Функции-члены 2

int main()
{
Employee emp(“Vasya”, “Ivanov”);
Programmer prog(“Petr”, “Petrov”, “GM12”);
emp.print();

Nortel Networks Confidential Функции-члены 2 int main() { Employee emp(“Vasya”, “Ivanov”); Programmer
emp.surname();
prog.print();
prog.surname();
}

Vasya Ivanov

Ivanov

Petr Petrov
GM12

Petrov

Слайд 14

Nortel Networks Confidential

Конструкторы

class Employee {
string name, surname;
public:
Employee(const string&,
const string&);
};
class

Nortel Networks Confidential Конструкторы class Employee { string name, surname; public: Employee(const
Programmer:
public Employee {
string team;
public:
Programmer(const string&,
const string&,
const string&);
//...
};

Employee::Employee(const string& n,
const string& sn)
: name(n), surname(sn)
{ /*...*/ }

Programmer::Programmer(
const string& _name,
const string& _surname,
const string& _team) :
Employee(_name, _surname),
team(_team)
{
//...
}

Слайд 15

Nortel Networks Confidential

Programmer::Programmer(
const string& name,
const string& sname,
const string& t)

Nortel Networks Confidential Programmer::Programmer( const string& name, const string& sname, const string&
:
name(name),
surname(sname),
team(t)
{
//...
}

// ошибка !

// ошибка !

class Employee {
string name, surname;
public:
Employee(const string&,
const string&);
};
class Programmer:
public Employee {
string team;
public:
Programmer(const string&,
const string&,
const string&);
//...
};

Конструкторы

Слайд 16

Nortel Networks Confidential

Копирование

Копируется только Employee-часть Programmer – срезка.

class Employee {
//...
Employee(const

Nortel Networks Confidential Копирование Копируется только Employee-часть Programmer – срезка. class Employee
Employee&);
Employee& operator=(const Employee&)
};
void f(const Programmer& rPrg)
{
Employee emp = rPrg;
emp = rPrg;
};

Слайд 17

Nortel Networks Confidential

class Employee {
string name, surname;
public:
Employee(const Employee&);
Employee& operator=(const

Nortel Networks Confidential class Employee { string name, surname; public: Employee(const Employee&);
Employee&)
//...
};

class Programmer: public Employee {
string team;
public:
Programmer(const Programmer &);
Programmer& operator=(const Programmer &)
//...
};

Копирование (продолжение)

Слайд 18

Nortel Networks Confidential

Копирование (продолжение)

Programmer::Programmer (const Programmer& rp)
: Employee(rp), team(rp.team)
{
}
Programmer& Programmer::operator=(const Programmer

Nortel Networks Confidential Копирование (продолжение) Programmer::Programmer (const Programmer& rp) : Employee(rp), team(rp.team)
&rp)
{
Employee::operator=(rp);
team = rp.team;
}

operator= не наследуется
Конструкторы не наследуются

Слайд 19

Nortel Networks Confidential

Иерархия классов

class Employee {/*...*/};
class Programmer: public Employee
{/*...*/};
class Team_leader: public Programmer
{/*...*/};
class

Nortel Networks Confidential Иерархия классов class Employee {/*...*/}; class Programmer: public Employee
Proj_manager: public Employee
{/*...*/};
class Senior_Manager: public Proj_manager
{/*...*/};
class HR_manager: public Employee
{/*...*/};

Programmer

Employee

Team_leader

Proj_manager

Senior_manager

HR_manager

Слайд 20

Nortel Networks Confidential

Иерархия классов - 2

class Team_leader: public Programmer {
public:
Team_leader(string n,

Nortel Networks Confidential Иерархия классов - 2 class Team_leader: public Programmer {
string fn, string t);
bool add_designer(Programmer*);
bool rm_designer(string fn, string n);
Programmer* get_designer(string fn, string n) const;
private:
list team_list;
};

Team_leader::Team_leader(string n,
string fn,
string t) : Programmer(n, fn, t),
team_list()
{}

Team_leader tm(“Igor”, “Kotov”, “GM12”);
tm.hire(Date(20,3,2008));
cout << tm.name();
tm.set_team(“GM18”);
tm.add_designer(p);
tm.fire(Date());

Имя файла: Друзья-классов.pptx
Количество просмотров: 138
Количество скачиваний: 0