Рубрики

Перегрузка операторов в C ++

В C ++ мы можем заставить операторы работать для пользовательских классов. Это означает, что C ++ имеет возможность придавать операторам особое значение для типа данных, эта возможность называется перегрузкой операторов.
Например, мы можем перегрузить оператор '+' в классе, подобном String, чтобы мы могли объединить две строки, просто используя +.
Другими примерами классов, где арифметические операторы могут быть перегружены, являются комплексное число, дробное число, большое целое число и т. Д.

Простой и полный пример

#include<iostream>

using namespace std;

  

class Complex {

private:

    int real, imag;

public:

    Complex(int r = 0, int i =0)  {real = r;   imag = i;}

      

    // Это автоматически вызывается, когда '+' используется с

    // между двумя сложными объектами

    Complex operator + (Complex const &obj) {

         Complex res;

         res.real = real + obj.real;

         res.imag = imag + obj.imag;

         return res;

    }

    void print() { cout << real << " + i" << imag << endl; }

};

  

int main()

{

    Complex c1(10, 5), c2(2, 4);

    Complex c3 = c1 + c2; // Пример вызова "operator +"

    c3.print();

}

Выход:

12 + i9

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

#include<iostream>

using namespace std;

  

class Complex {

private:

    int real, imag;

public:

    Complex(int r = 0, int i =0)  {real = r;   imag = i;}

    void print() { cout << real << " + i" << imag << endl; }

  
// Глобальная операторная функция стала другом этого класса
// что он может получить доступ к закрытым членам

friend Complex operator + (Complex const &, Complex const &);

};

  

  

Complex operator + (Complex const &c1, Complex const &c2)

{

     return Complex(c1.real + c2.real, c1.imag + c2.imag);

}

  

  

int main()

{

    Complex c1(10, 5), c2(2, 4);

    Complex c3 = c1 + c2; // Пример вызова "operator +"

    c3.print();

    return 0;

}

Можем ли мы перегрузить всех операторов?
Почти все операторы могут быть перегружены, кроме немногих. Ниже приведен список операторов, которые не могут быть перегружены.

   . (dot) 
   :: 
   ?: 
   sizeof 

Почему не могу (точка), ::,?: и sizeof быть перегруженным?
Смотрите это для ответов от самого Страуструпа.

Важные моменты о перегрузке оператора
1) Чтобы перегрузка оператора работала, хотя бы один из операндов должен быть объектом класса, определенного пользователем.

2) Оператор присваивания: компилятор автоматически создает оператор присваивания по умолчанию для каждого класса. Оператор присваивания по умолчанию назначает все элементы правой стороны левой стороне и прекрасно работает в большинстве случаев (это поведение аналогично конструктору копирования). Смотрите это для более подробной информации.

3) Оператор преобразования. Мы также можем написать операторы преобразования, которые можно использовать для преобразования одного типа в другой.

#include <iostream>

using namespace std;

class Fraction

{

    int num, den;

public:

    Fraction(int n,  int d) { num = n; den = d; }

  

    // оператор преобразования: возвращаемое значение с плавающей запятой дроби

    operator float() const {

        return float(num) / float(den);

    }

};

  

int main() {

    Fraction f(2, 5);

    float val = f;

    cout << val;

    return 0;

}

Выход:

0.4

Перегруженные операторы преобразования должны быть методом-членом. Другие операторы могут быть либо методом-членом, либо глобальным методом.

4) Любой конструктор, который можно вызвать с одним аргументом, работает как конструктор преобразования, это означает, что он также может использоваться для неявного преобразования в конструируемый класс.

#include<iostream> 

using namespace std;

  

class Point

{

private:

    int x, y;

public:

    Point(int i = 0, int j = 0) {

        x = i;   y = j;

    }

    void print() {

        cout << endl << " x = " << x << ", y = " << y;

    }

};

  

int main() {

    Point t(20, 20);

    t.print();

    t = 30;   // Член х т становится 30

    t.print();

    return 0;

}

Выход:

 x = 20, y = 20
 x = 30, y = 0

Скоро мы обсудим перегрузку некоторых важных операторов, таких как new, delete, запятая, вызов функции, стрелка и т. Д.

Тест на перегрузку оператора

Ссылки:
http://en.wikipedia.org/wiki/Operator_overloading

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

Рекомендуемые посты:

Перегрузка операторов в C ++

0.00 (0%) 0 votes