Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

Void main(void)

{

//создание обьектов а, b, d, s класса V_3d

V_3d a;

V_3d b;

V_3d d,s;

cout << " Введите координаты x,y,z вектора a: \n";

cin >> a;

cout << "координаты вектора a:\n";

cout << a;

cout << " Введите координаты x,y,z вектора b: \n";

cin >> b;

cout << "координаты вектора b:\n";

cout << b;

d=a+b; //демонстрация перегруженной операции сложения векторов a и b

cout << "\n сумма векторов a и b :\n";

cout << d;

s=a; // демонстрация перегруженной операции присваивания

cout << "\n координаты вектора s\n";

++s;

cout << s;

cout << "\n координаты вектора s после увеличения на 1\n";

cout << s;

}

// определение функции друга для вывода вектора

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

{

stream << "x=" << obj.x <<", " ;

stream << "y=" << obj.y <<", " ;

stream << "z=" << obj.z <<"\n" ;

return stream; //возврат потока

}

//определение функции друга для ввода вектора

istream &operator >>(istream &stream, V_3d &obj)

{

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

return stream;

}

// определение дружественной функции - оператора +

V_3d operator +(V_3d op1,V_3d op2)

{

V_3d c;

c.x=op1.x+op2.x;

c.y=op1.y+op2.y;

c.z=op1.z+op2.z;

return c;

}

// определение дружественной функции - оператора ++

V_3d operator ++(V_3d &op1)

{

op1.x++;

op1.y++;

op1.z++;

return op1;

}

// определение функции - оператора=

V_3d V_3d::operator =(V_3d t)

{

x=t.x;

y=t.y;

z=t.z;

return *this;

}

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

Перегруженные функции operator >> и operator << не являются методами класса V_3d, это функции-друзья класса. Действительно, ни функция вставки, ни функция извлечения не могут быть методами класса. Причина заключается в том, что если функция-оператор является методом класса, то левым операндом, неявно передаваемым с использованием указателя this служит объект того класса, который осуществляет вызов функции-оператора. И нет способа изменить такой порядок. Левым же аргументом функций операторов, перегружающих операции >> и <<является ссылка на потоки ввода или вывода, которые не принадлежат классу, создаваемому пользователем в программе. Поэтому перегруженные функции операторы operator >> и operator << не могут быть методами класса, созданного пользователем. Это позволяет сохранить неизменным принцип инкапсуляции ООП.

Контрольные вопросы

1.Каким образом осуществляется перегрузка операций в С++?

2.Каков синтаксис объявления оператора – функции?

3.Каков механизм передачи параметров оператору – функции при перегрузке бинарных операций?

4.Почему при перегрузке унарных операций оператор-функция не имеет параметров?

5.Какая функция называется другом класса?

6.В чем особенности передачи параметров дружественной функции при перегрузке унарных и бинарных операций?

7. Как выполняется перегрузка операций >> и << для ввода и вывода встроенных типов языка?

8. Как выполняется перегрузка операций >> и << для ввода и вывода типов, объявленных пользователем?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]