пример 4: преклопљени оператори, вишеструки конструктори

модул komplex

komplex.h

#ifndef _komplex.h

#define _komplex.h

class TComplex
{
double real;
double imaginar;
public:
TComplex(); // konstruktor
TComplex(double r, double i); // konstruktor
void set_r(double r);
double get_r() const; // inspektor
void set_i(double i);
double get_i() const;// inspektor

TComplex& operator=(TComplex c);
TComplex operator+(TComplex c);
TComplex operator-(TComplex c);
TComplex operator*(TComplex c);
TComplex operator/(TComplex c);
TComplex& operator++();
TComplex& operator--();
};

#endif

komplex.cpp

#include "komplex.h"


TComplex::TComplex(): real(0), imaginar(0)
{
}

TComplex::TComplex(double r, double i): real(r), imaginar(i)
{
}

void TComplex::set_r(double r)
{
real=r;
}

double TComplex::get_r() const
{
return real;
}

void TComplex::set_i(double i)
{
imaginar=i;
}

double TComplex::get_i() const
{
return imaginar;
}

TComplex& TComplex::operator=(TComplex c)
{
real=c.get_r();
imaginar=c.get_i();
return *this;
}

TComplex TComplex::operator+(TComplex c)
{
TComplex rezultat;
rezultat.set_r(real+c.get_r());
rezultat.set_i(imaginar+c.get_i());
return rezultat;
}

TComplex TComplex::operator-(TComplex c)
{
TComplex rezultat;
rezultat.set_r(real-c.get_r());
rezultat.set_i(imaginar-c.get_i());
return rezultat;
}

TComplex TComplex::operator*(TComplex c)
{
TComplex rezultat;
rezultat.set_r(real*c.get_r());
rezultat.set_i(imaginar*c.get_i());
return rezultat;
}

TComplex TComplex::operator/(TComplex c)
{
TComplex rezultat;
rezultat.set_r(real/c.get_r());
rezultat.set_i(imaginar/c.get_i());
return rezultat;
}

TComplex& TComplex::operator++()
{
real++;
imaginar++;
return *this;
}

TComplex& TComplex::operator--()
{
real--;
imaginar--;
return *this;
}

main функција

#include <conio>
#include <iostream>
#include "komplex.h"

main()
{
TComplex c, c1(1,1), c2(3,4);
cout<<"c  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
cout<<"c1  real: "<<c1.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
cout<<"c2  real: "<<c2.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<

cout<<endl;

c=c1+c2;
cout<<"c=c1+c2  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
c=c1-c2;
cout<<"c=c1-c2  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
c=c1*c2;
cout<<"c=c1*c2  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
c=c1/c2;
cout<<"c=c1/c2  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<
c++;
cout<<"c++  real: "<<c.get_r()<< "<span="" data-mce-bogus="1" class="mceItemHidden mceItemNbsp">  imag: "<

getch();
}

Питање за наставника ...

 

пример 5: наслеђивање

Наслеђивање је концепт ООП-а који (уз полиморфизам) омогућава тзв. code reusability, односно поновно коришћење кода. То је концепт који у многоме повећава продуктивност програмера.

Наслеђивање је релација (однос) између класа. На пример, ако класа Б наслеђује класу А то значи:

  • објекти класе Б су једна врста објеката класе А
  • објекти класе Б имају све особине класе А и још могу да имају и неке додатне своје особине

Наслеђивање се у језику C++ реализује "извођењем класа". Извођење није исто што и наслеђивање, већ је шири појам. То значи да није свако извођење истовремено и наслеђивање.

Питање за наставника ...

пример:

class A
{
public:
void f();
};

class B: public A
{
public:
void g();
};

У горњем примеру јавно смо извели класу Б из класе А (class B: public A) што је једино извођење које је истовремено и наслеђивање. Постоје и тзв protected и private извођења, која нису наслеђивање зато јер у том случају однос између класа А и Б није такав да је Б "једна врста" А, него је класа Б класа која "садржи" класу А. Овим врстама извођења се нећемо бавити, јер се користе релативно ретко.

У примеру који смо дали, класа А има једну методу f() а класа Б која је наследила А има наслеђену методу f() и још додатну своју методу g().

Класе наследнице наслеђују и "виде" све делове родитељске класе који нису у private секцији (значи public и protected). Конструктори и деструктори (види овде) се НЕ наслеђују. Приликом креирања објекта класе наследнице, прво се извршавају конструктори њене родитељске класе па тек онда конструктор те класе. Код деструктора је супротно: прво се активира деструктор наследнице, па затим деструктор родитеља.

Још један, мало већи пример наслеђивања можете да преузмете овде.

Питање за наставника ...