des types natifs qui seront geres comme tels, nativement, par le hardware ; des ints, des floats, des pointeurs, etc. tout ca, c´est des types primitifs.
a partir du moment ou on commence a faire des aggregats de ces types en des structures plus evoluees, on sort du domaine du type primitif (ex bidon, un float est primitif, un aggregat de 2 floats en un Complexe ne l´est pas)
admettons que tu fasses une classe Vecteur2D, si tu fais un operateur membre de multiplication par un scalaire, genre :
Vecteur2D Vecteur2D::operator *(float _k) const
{
bla bla..
}
Vecteur2D const &Vecteur2D::operator *=(float _k)
{
- this = this->operator *(_k);
return this;
}
ben ca ne marche que si tu fais Vecteur2D*float .. si tu fais float*Vecteur2D , il n´y pas d´operator prenant cette signature.
LA une fonction externe permet de rendre ca symetrique.
Par contre sur des objets, c´est tres souvent non commutatif, et chaque objet devrait definir ses operateurs, s´il en a besoin.
C´est pourquoi il est interessant de faire des operateurs externes sur des types primitifs, mais pas sur des objets.