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

Создание функций преобразования

Функция преобразования автоматически преобразует тип класса в другой тип.

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

operator type() {return value;}

Здесь элемент type — новый тип, который является целью нашего преобразования, а элемент value— значение после преобразования. Функция преобразования должна быть членом класса, для которого она определяется.

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

operator int() { return х * у * z; }

Теперь рассмотрим программу, которая иллюстрирует работу функции преобразования.

#include

using namespace std;

class three_d {

  int x, y, z; // 3-мерные координаты

 public:

  three_d(int a, int b, int с) { x = a; у = b; z = c; }

  three_d operator+(three_d op2);

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

  operator int() {return x * у * z; }

};

/* Отображение координат X, Y, Z - функция вывода данных для класса three_d.

*/

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

{

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

 stream << obj.у << ", ";

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

 return stream;

}

three_d three_d::operator+(three_d op2)

{

 three_d temp(0, 0, 0);

 temp.x = x+op2.x;

 temp.у = y+op2.y;

 temp.z = z+op2.z;

 return temp;

}

int main()

{

 three_d a(1, 2, 3), b(2, 3, 4);

 cout << a << b;

 cout << b+100; /* Отображает число 124, поскольку здесь выполняется преобразование объекта класса в значение типа int. */

 cout << "\n";

 а = а + b; // Сложение двух объектов класса three_d выполняется без преобразования типа.

 cout << а; // Отображает координаты 3, 5, 7

 return 0;

}

Эта программа генерирует такие результаты.

1, 2, 3

2, 3, 4

124

3, 5, 7

Как подтверждают результаты выполнения этой программы, если в таком выражении целочисленного типа, как cout<, используется объект типа three_d, к этому объекту применяется функция преобразования. В данном случае функция преобразования возвращает значение 24, которое затем участвует в операции сложения с числом 100. Но когда в преобразовании нет необходимости, как при вычислении выражения а=а+b, функция преобразования не вызывается.

Если функция преобразования создана, то она будет вызываться везде, где требуется преобразование, включая ситуации, когда объект передается функции в качестве аргумента. Например, если объект класса three_d передать стандартной функции abs(), также будет вызвана функция, выполняющая преобразование объекта типа three_d в значение типа int, поскольку функция abs() должна принимать аргумент целочисленного типа.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги