Някой може ли да ми разясни как работи тази програма.Трябва да събира 2 дроби.И ако може да ми обясни как работи конструктора.И ако се сещате да ми препоръчате свестен учебник да си купя(нещо като помагало).благодаря предварително

#include <iostream>
using namespace std;
class Frac
{
int Num, Den;
bool Corr;
void norm()
{
if(!Corr) return;
if(Num==0)
{
Den=1;
return;}
int a=Num , b=Den, c;
if(a<0) a=-a;
if(a>b)
{
c=a;a=b;b=c;}
do
{c=a%b;
if(c==0) break;
a=b;
b=c;
}
while (true);
Num/=b;
Den/=b;}
public:
int getNum() const{return Num;};
int getDen() const{return Den;};
Frac sum(Frac a=0, Frac b=1)
{
n,d,n2;
n=a.Num*b.Den;
n2=b.Num*a.Den;
n+=n2;
d=a.Den*b.Den;
return Frac(n,d);
}
Frac(int a,int b)
{
Num=a;
Den=b;
Corr=b>0;
norm();
}
void setNum(int a)
{
Num=a;
norm();
}
setDen(int a)
{
Den=a;
Corr=a>0;
norm();
}
void show()
{
if(Corr)
{
cout<<Num;
if(Den>1) cout<<"/"<<Den;
cout<<endl;
else cout<<"Incorrect";
};
Frac operator +(const Frac &a, const Frac &b)
{
int n,d;
n=a.getNum()*b.getDen+b.getNum()*a.getDen();
d=b.getDen()*a.getDen();
return Frac(n,d);
}
int main()
{
Frac f(1,2), g(3,4);
Frac c=f+g;
c.show();
return 0;
}