ОСОБЕННОСТИ РЕАЛИЗАЦИИ ПЕРЕГРУЗКИ ОПЕРАЦИЙ В С++

Научная статья
Выпуск: № 4 (11), 2013
Опубликована:
08.05.2013
PDF

Степович-Цветкова Г.С.

Кандидат экономических наук, Ивановский государственный университет

ОСОБЕННОСТИ РЕАЛИЗАЦИИ ПЕРЕГРУЗКИ ОПЕРАЦИЙ В С++

Аннотация

В статье рассмотрены особенности реализации перегрузки операций на языке С++ различными способами, выявлены основные различающие признаки и особенности программирования.

Ключевые слова: перегрузка операций, способы реализации, особенности.

Stepovitch-Tsvetkova G.S.

PhD in economic, Ivanovo State University

IMPLEMENTATION NOTES OF OPERATOR OVERLOADING IN C++

Abstract

The article considers the features of operator overloading in C++ in various ways, identified the main distinguishing features and characteristics of programming.

Keywords: operator overloading, methods of implementation, features.

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

Программная реализация перегрузки операций может быть осуществлена несколькими способами. Во-первых, функция, реализующая переопределяемую операцию, может быть методом класса, который описывает создаваемый программистом тип данных. В этом случае отличие такой функции-метода от обычного метода класса заключается лишь в наличии ключевого слова operator, которое здесь можно воспринимать как неотделимую часть имени метода. Тогда определение такого метода либо располагается внутри описания класса непосредственно после заголовка метода, либо его определение выносится за рамки описания класса с указанием имени класса с помощью операции доступа к области видимости (::), что позволяет идентифицировать метод.

Например, рассмотрим перегрузку бинарной операции сложения в классе n-мерный вектор. Реализация с помощью метода класса с определением метода внутри класса будет выглядеть следующим образом:

При вынесении определения метода за рамки класса, оставляя внутри класса лишь заголовок метода, реализация будет выглядеть следующим образом:

Отметим, что первый операнд записывается в скрытый указатель this, поэтому методу передается только один формальный параметр – второй операнд.

Вторым способом реализации перегрузки является написание дружественной функции. Такой подход может быть оправданным, поскольку считается, что методами класса должны описываться некоторые свойства объектов класса, а операции свойствами не являются. Так, например, стандартная операция вывода (<<) реализована в языке С++ в специальной библиотеке iostream, осуществляющей потоковый ввод-вывод. В этом случае реализация перегрузки осуществляется вне описания класса, так как это отдельная от класса функция, а внутри класса помещается заголовок этой функции с ключевым словом friend только для того, чтобы предоставить этой функции доступ к скрытым полям класса, необходимым ей для работы.

Однако в данном случае количество формальных параметров функции уже увеличено до двух, поскольку дружественным функция указатель this не передается, а, следовательно, оба операнда должны быть переданы в качестве параметров. Обратим внимание, что внешне вторая реализация отличается от первой только лишь количеством параметров в функции, однако, это принципиально иная реализация, и количество параметров – это вторичный показатель отличия этих двух способов реализации перегрузки функций.

Тритим способом реализации перегрузки операций является написание простой функции, не только не являющейся методом класса, но и даже не дружественной классу. В таком случае никакого упоминания о ней внутри класса не требуется. Однако как и в предыдущем случае функции не передается указатель this, так как непосредственного отношения эта функция к классу не имеет и вызывается сама по себе, а не через объект класса.  Кроме того, для такой функции недоступны скрытые поля класса, в которых записаны данные, необходимые для сложения. Поэтому необходимо наличие в классе открытых методов, предоставляющих доступ к закрытым полям класса, а именно дополним класс методами get_n() и get_mas(), возвращающими значения полей данных, а также методом prisv, заполняющим определенную координату вектора заданным значением:

Тогда функция, реализующая перегрузку оперции сложения для класса n-мерный вектор, будет выглядеть следующим образом:

Таким образом, существует три различных способа реализации перегрузки операций в С++, каждый из которых имеет свои особенности, отражающиеся на принципах программирования.

Список литературы

  • Лафоре Р. Объектно-ориентированное программирование в С++. – 4-е изд. – М. : Питер, 2004. – 923 с.

  • Шилдт Г. Искусство программирования на С++. – СПб. : БХВ-Петербург, 2005. – 496 с.