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



Перегрузка операций позволяет определить действия для объектов в выражениях.

<имя_класса> operator op(<имя_класса > a, < имя_класса > b) – общий вид перегруженной операции op.

В С++ существует 40 операций, которые можно перегрузить.

Нельзя перегрузить следующие операции: «.», «.*»,«?:», «::», «sizeof», «#», «##».

При создании описания класса существует две возможности определения операций:

1) определение операции как функции класса;

2) определение операции как дружественной функции.

Если бинарная перегруженная операция реализована как функция класса, то ее первым операндом является объект, которому принадлежит сообщение, следовательно, такой функции передается только второй член операции, следовательно, у нее 1 параметр.

Если унарная перегруженная операция реализована как функция класса, то у нее нет параметров.

Если перегруженная операция реализована как дружественная функция, то ей передается 1 или 2 параметра.

Пример (работа с комплексными числами):

Вариант 1.

F1.h

class Complex

{ float real, imag;

public:

Complex(float aReal, float aImag): real(aReal), imag(aImag) {};

Complex() {real=imag=0.0;}

Complex(float aReal): real(aReal), imag(0.0) {};

float GetReal() {return real;}

float GetImag() {return imag;}

friend Complex operator+(Complex &c1, Complex &c2);

friend Complex operator-(Complex &c1, Complex &c2);

};

 

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

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

Complex operator-(Complex &c1, Complex &c2)

{ return Complex(c1.real-c2.real, c1.imag-c2.imag);}

F1.cpp

#include <iostream.h>

#include "f1.h"

void main()

{

Complex a(1.0,2.0), b(3.0,4.0);

a=a+b;

cout<<a.GetReal()<<endl<<a.GetImag()<<endl;

}

Вариант 2.

F1.h

class Complex

{ float real, imag;

public:

Complex(float aReal, float aImag): real(aReal), imag(aImag) {};

Complex() {real=imag=0.0;}

Complex(float aReal): real(aReal), imag(0.0) {};

float GetReal() {return real;}

float GetImag() {return imag;}

void operator+(Complex &c1);

void operator-(Complex &c1);

};

 

void Complex::operator +(Complex &c1)

{ real+=c1.real;

imag+=c1.imag;

}

void Complex::operator -(Complex &c1)

{ real-=c1.real;

imag-=c1.imag;

}

F1.cpp

#include <iostream.h>

#include "f1.h"

void main()

{

Complex a(1.0,2.0), b(3.0,4.0);

a+b;

cout<<a.GetReal()<<endl<<a.GetImag()<<endl;

}

Нельзя смешивать два типа объявлений.


Дата добавления: 2015-12-18; просмотров: 15; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!