Ho scritto questo codice per fare un po' di pratica con gli operatori, ed ho scoperto una cosa strana:

codice:
#include <iostream>

using namespace std;

class Zn
{
    private:
        unsigned int _n;
        int _val;
        int _mod(int x);
    public:
        Zn(unsigned int n){ _n = n; }

        Zn operator =(Zn b);
        Zn operator =(int x);
        Zn operator +(Zn b);
        //Zn operator -(Zn b;)

        void print(){ cout << _val<< "\n" ; }
};

int Zn::_mod(int x)
{
    if (x < 0)
        return _n - ((-x) % _n);
    else
        return x % _n;
}

Zn Zn::operator =(Zn b)
{
    cout << "Chiamato Zn = Zn\n";
    _val = _mod(b._val);
    return *this;
}

Zn Zn::operator =(int x)
{
    cout << "Chiamato Zn = Int\n";
    _val = _mod(x);
    return *this;
}

Zn Zn::operator +(Zn b)
{
    cout << "Chiamato Zn + Zn\n";
    Zn temp(_n);
    temp = _mod(_val + b._val);
    return temp;
}

int main()
{
    Zn a(5), b(5), c(5);

    a = 2; cout << "STOP 1!\n";
    c = a + 4; cout << "STOP 2!\n";
    a.print(); c.print();

    return 0;
}
lo compila correttamente e funziona anche.

Ora, io ho ridefinito l' = tra classe e classe, e tra classe e int, e il + tra classe e classe.
Nel main vado a fare con c = a + 4, classe + int, ma classe + int non è definita! Come fa a "indovinare" cosa deve fare?!?!?!!?