Po pierwsze jeżeli w argumencie przesyłasz jakiś obiekt to należy przesyłać go przez stałą referencję, chyba że masz uzasadniony przypadek, że musi być przez niestałą,
MojaKlasa(const MojaKlasa& obj);
Następnie nie ma sensu robić metod podziel, odejmij itd. bo wywołanie by musiało wyglądać:
obj = obj1.dodaj(obj1, obj2);
zamień te metody na np:
MojaKlasa& operator+(const MojaKlasa& obj){
L1 += obj.L1; //operacja dodawaia
cout << "dodaje" << endl;
return *this; //zwracasz obiekt, w ktorym zmieniona jest wartosc L1
}
//teraz wywołanie
obj = obj1 + obj2;
Skoro zmienna value nie jes używana to nie powinno jej być a L1 powina być prywatna. Dobrym zwycajem jest nazywanie zmiennych prywatnych nazwami zaczynającymi się od '_' (chodzi o to, że wiadomo co jest zmienną prywatą a co publiczną).