Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Void main(void)

{

Vector a(1,2,3),b(4,5,6);

cout<<a<<”\n”<<b<<”\n”;

}

Общая форма функции инсертора следующая:

ostream &operator <<(ostream &stream, class_type obj)

{

// тело программы

return stream;

}

Используется вариант

stream << obj.x<<”, “; а не cout<< obj.x<<”, “;

так как второй вариант жестко связан с потоком cout, a первый вариант может быть применен к любому потоку.

В предыдущем примере данные-члены класса vector объявлены как public. Функция – инсертор не может быть членом класса. Для того, чтобы она имела доступ к приватным элементам класса, необходимо объявить ее “другом“ класса. Тогда предыдущий пример будет иметь вид:

#include <iostream.h>

class vector{

public:

int x, y, z;

vector (int a, int b, int c) { x=a; y=b; z=c;}

friend ostream &operator <<(ostream &stream, vector obj);

}

ostream &operator <<(ostream &stream, vector obj)

{

stream << obj.x<<”, “;

stream << obj.y<<”, “;

stream <<obj.z<<”\n”;

return stream:

}

Void main(void)

{

Vector a(1,2,3),b(4,5,6);

cout<<a<<”\n”<<b<<”\n”;

}

Для перегрузки функции >> для класса vector можно использовать следующую функцию-экстрактор:

istream &operator <<(istream &stream, vector obj)

{

cout<<”Enter x,y,z:”;

stream >> obj.x>>obj.y>>obj.z;

return stream:

}

Так же как и инсертор, функции-экстрактор не может быть членом класса, а поэтому используется как дружественная функция класса. Рассмотрим пример с использованием функции-экстрактора.

#include <iostream.h>

class vector{

public:

int x, y, z;

vector (int a, int b, int c) { x=a; y=b; z=c;}

friend ostream &operator <<(ostream &stream, vector obj);

friend istream &operator <<(istream &stream, vector obj);

}

ostream &operator <<(ostream &stream, vector obj)

{

stream << obj.x<<”, “;

stream << obj.y<<”, “;

stream <<obj.z<<”\n”;

return stream:

}

istream &operator <<(istream &stream, vector obj)

{

cout<<”Enter x,y,z:”;

stream >> obj.x>>obj.y>>obj.z;

return stream:

}

Void main(void)

{

Vector a(1,2,3);

cout<<a;

cin>>a;

cout<<a;

}

Дружественные функции-операции

Функции-операции могут быть членами класса или дружественными функциями класса. Отличие дружественных функций состоит в том, что для них не используется указатель this. При объявлении дружественной функции-оператора должны передаваться два аргумента для бинарных операций и один для унарных операций. Дружественными функциями не могут перегружаться операции =, (), [],->.

Пример перегрузки операции + для класса vector с помощью дружественной операции.

class vector

{

int x,y,z; // Три координаты

public:

friend vector operator + (vector t1, vector t2);

vector operator+(vector t);

void show(void);

void assign( int mx, int my, int mz);

};

vector operator+(vector t1, vector t2)

{

vector temp;

temp.x=t1.x+t2.x;

temp.y=t1.y+t2.y;

temp.z=t1.z+t2.z;

return temp;

}

Во многих случаях преимуществ использования дружественных функций перед функциями-членами при перегрузке нет. Однако есть ситуация, в которой использование дружественных функций обязательно. Перегрузку операции умножения объекта типа vector на целое можно записать и в виде функции-члена и в виде дружественной функции. В то же время операцию умножения целое на vector можно определить только через дружественную функцию.

#include <iostream.h>

class CL{

public:

int c;

CL operator=(int i);

friend CL operator+(CL ob, int i);

friend CL operator+(int i, CL ob);

};

CL CL::operator=(int i)

{

c = i;

return *this;

}

CL operator+(CL ob, int i)

{

CL temp;

temp.c=ob.c+i;

return temp;

}

CL operator+(int i, CL ob)

{

CL temp;

temp.c=ob.c+i;

return temp;

}