Файл: Лабораторная работа. Перегрузка опций.pdf

Добавлен: 30.10.2018

Просмотров: 843

Скачиваний: 13

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ  

РОССИЙСКОЙ ФЕДЕРАЦИИ 

 

Государственное образовательное учреждение  

высшего профессионального образования 

"Донской государственный технический университет" 

ДГТУ 

 

Кафедра "Программное обеспечение вычислительной техники и 

автоматизированных систем" 

 

 

Перегрузка операций 

 

 

Методические указания к лабораторным работам по дисциплинам "Языки про-

граммирования", "Объектно-ориентированное программирование", "Техноло-

гии объектно-ориентированного программирования" 

 

 

 

 

 

 

 

 

 

Ростов-на-Дону 

20     г. 

 


background image

 

 

Составитель:   к.ф.-м.н., доц. Габрельян Б.В. 

 

УДК 512.3 

 

Друзья класса. Перегрузка операций: методические указания – Ростов н/Д: Из-

дательский центр ДГТУ, 20    . –     с. 

 

 

 

 

В методической разработке рассматриваются общие правила перегрузки опера-

ций и использования для этого дружественных функций в C++.  Даны задания 

по  выполнению  лабораторной  работы.  Методические  указания  предназначены 

для  студентов  специальностей  230105  "Программное  обеспечение  вычисли-

тельной  техники  и  автоматизированных  систем",  010503  "Математическое 

обеспечение  и  администрирование  информационных  систем",  090102  "Компь-

ютерная безопасность". 

 

 

 

 

 

 

 

 

 

 

© Издательский центр ДГТУ, 20         

 


background image

 

I. Перегрузка операций в C++. 

 

В  C++  можно  переопределить  большинство  значков  операций  заданных 

для стандартных типов для собственных классов. Например, если A это класс, а 

a1 и a2 объекты этого класса, то компилятор не знает, как выполнить сложение 

двух  его  объектов,  т.е.  значение  выражения  a1  +  a2  может  быть  вычислено, 

только если для класса будет задана функция или метод, с алгоритмом такого 

вычисления. Такая функция (или такой метод) должна иметь строго определен-

ное имя, состоящее из зарезервированного в C++ слова operator и значка опера-

ции (через пробел или без пробела, за исключением операций new и delete, для 

которых  пробел  обязателен).  В  общем  случае  выражение  a1  +  a2  компилятор 

трактует либо как вызов метода для объекта a1  

a1.operator+( a2 ), 

либо как вызов внешней функции с двумя аргументами a1 и a2 

 

operator+(a1,a2). 

 

Общие правила перегрузки операций в C++ таковы: 

1.  Нельзя задать новый значок операции. 

2.  Нельзя  изменить  арность  (число  аргументов),  приоритет  и  ассоциатив-

ность операции. 

3.  Нельзя переопределить операцию для стандартного типа. 

4.  Нельзя переопределять операции "запятая", sizeof, ::, ., .*, ?:, typeid, throw, 

dynamic_cast<>, static_cast<>, const_cast<>, reinterpret_cast<>. 

Некоторые другие ограничения рассмотрены ниже.  

 

II. Перегрузка операций с помощью методов класса. 

 

Операции  =,  [],  (),  ->  могут  быть  перегружены  только  методами  класса. 

Если перегруженная операция реализована как метод, то ее единственный (для 

унарных  операций)  или  первый/левый  аргумент  (для  бинарных  операций)  до-

ступен методу через скрытый аргумент this. Например, 

 

class A { 

 

 

int a; 


background image

 

 

   public: 

 

 

A(int x) { a = x; } 

 

 

int getA() { return a; } 

 

 

void setA(int x) { a = x; } 

 

 

A  operator+(A&  right)  {  /*  перегруженная  операция  для  сложения 

объектов класса A */ 

 

 

 

return A( a + right.a ); 

 

 

}; 

 

 

int main() { 

 

 

A a1(1), a2(2), a3(3); 

 

 

a1.setA( 5 ); 

a2.setA( 10 ); 

a3 = a1 + a2;  // a3 = a1.operator+(a2); 

 

 

return 0; 

 

III. Перегрузка операций с помощью внешних функций. 

 

Бывают  такие  виды  операций,  когда  их  перегрузка  с  помощью  методов 

невозможна. Например, класс A рассмотренный выше позволяет попарно скла-

дывать свои объекты, но не позволяет добавить к целому числу объект класса. 

Вообще,  если  левый  аргумент  операции  не  является  объектом  нашего  класса, 

такую операцию нельзя перегрузить с помощью метода нашего класса. Прихо-

дится использовать внешнюю функцию и, что дать ей прямой доступ к закры-

тым  полям  класса,  такую  функцию  часто  объявляют  дружественной  классу. 

Характерным  примером,  кроме  приведенного  выше,  является  также  желание 

переопределить  для  класса  операцию  помещения  в  поток  (или  извлечения  из 

потока). Левым аргументом такой операции должен быть поток, т.е. объект чу-

жого класса ostream. Например, 


background image

 

 

#include <iostream> 

 

 

using namespace std; 

 

 

class A { 

 

 

friend ostream& operator<<(ostream&,A&); /* переопределенная опе-

рация помещения в поток */ 

 

 

int a; 

 

   public: 

 

 

A(int x) { a = x; } 

}; 

 

 

ostream& operator<<(ostream& o, A& x) { 

 

 

return o<<x.a; 

 

 

 

int main() { 

 

 

A aObj( 10 ); 

 

 

cout<<aObj<<endl;  // помещение объекта в поток 

 

 

return 0; 

 

 

IV. Задания. 

1. Описать класс Test c защищенными числовым полем W и функцией Z, кото-

рая  выводит  сообщение    "Это  закрытая  функция  класса  Test".  Написать  кон-

структор для инициализации объектов класса Test с одним параметром, прини-

мающим по умолчанию значение 1. Объявить другом класса функцию fun, ко-

торая не возвращает значений и получает указатель на объект типа Test. 

2. Описать на внешнем уровне функцию fun, которая выводит на экран значе-

ние параметра W и вызывает из класса Test функцию Z.