====== La surcharge d'opérateurs ====== [[..:td_3|Sujet complet]] ===== Question n° 1 ==== Nous considérons la classe ''rational'' qui avait été présentée dans la [[in202:seance_1:td_1|partie 1 du premier TD]]. #include #include #include class rational { private: long m_numerator; long m_denominator; template friend inline std::basic_ostream& operator << ( std::basic_ostream& aStream, const rational& aRational); public: rational() : m_numerator(0), m_denominator(1) {} rational(long theNumerator) : m_numerator(theNumerator), m_denominator(1) {} rational(long theNumerator, long theDenominator) { if (theDenominator == 0) throw std::invalid_argument("denominator is 0"); if (theDenominator < 0) { theNumerator *= -1; theDenominator *= -1; } m_numerator = theNumerator; m_denominator = theDenominator; } rational(const rational& aRational): m_numerator(aRational.m_numerator), m_denominator(aRational.m_denominator) {} operator double() const { return (double)m_numerator / (double)m_denominator; } rational operator + (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator + m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator - (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } rational operator * (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_numerator, m_denominator * anotherRational.m_denominator); } rational operator / (const rational& anotherRational) const { return rational(m_numerator * anotherRational.m_denominator - m_denominator * anotherRational.m_numerator, m_denominator * m_numerator); } }; template inline std::basic_ostream& operator << ( std::basic_ostream& aStream, const rational& aRational) { aStream << aRational.m_numerator; if (aRational.m_denominator != 1) aStream << "/" << aRational.m_denominator; return aStream; } Recenser les opérateurs qui ont été surchargés ? ===== Question n° 2 ==== Définissez les opérations testant si deux nombres rationnelles sont égaux. Attention, il faut est capable de bien détecter que ''1/2 == 2/4'' sont égaux. Typiquement, il faudra définir deux opérateurs : class rational { ... public: bool operator == (const rational&) const; bool operator != (const rational&) const; }; ==== Code présenté pendant le cours ==== {{https://perso.ensta-paris.fr/~bmonsuez/Media/code/in202/2021/td3/part4/part4.cpp|''part4.cpp''}} Fichier principal contient les fonctions de test et le main. {{https://perso.ensta-paris.fr/~bmonsuez/Media/code/in202/2021/td3/part4/rational.h|''rational.h''}} Définition de la classe des nombres rationnels. ===== Liens vers les éléments syntaxiques et ressources externes ===== [[cpp:syntax:operator:overload|La surcharge d'opérateurs en C++]] ===== Navigation ===== [[.:part_iii|Troisième partie]]