iostream
Pour étendre les opérateurs CPP
1+1 = notation 1 fix avec + entre les deux opérandes
+11 = notation prefixe ⁼ notation fonctionnelle, on a une notation qui se rapproche d'une fonction membre 1.+(1) soit une instance (le premier 1) sur laquelle on fera appel à la fonction membre + à qui on passerait en paramètre 1
11+ = notation postfix pour le calcul sur pile
La surcharge de l'opérateur se fait avec le mot clé "operator" (unaire ou binaire, le ternaire n'est pas surchargeable)
= est un operateur binaire (grace au paramètre caché sous this)
+ est un operateur binaire
le fichier main :
#include "Integer.class.hpp" int main () { Integer x( 30 ); Integer y( 10 ); Integer z( 0 ); // sortie << grace a la surcharge std::cout << "Value of x : "<< x << std::endl; std::cout << "Value of y : "<< y << std::endl; y = Integer( 12); std::cout << "Value of y : "<< y << std::endl; std::cout << "Value of z : "<< z << std::endl; z = x + y; std::cout << "Value of z : "<< z << std::endl; return (0); }
le fichier .hpp :
#ifndef INTEGER_CLASS_HPP # define INTEGER_CLASS_HPP #includeclass Integer { public: Integer( int const n ); ~Integer( void ); int getValue( void ) const; // deux surcharges d'opperateur // rhs = right on side, left on side est cache = param d'instance // operateur d'assignation, renvoi de l'instance courante Integer & operator=( Integer const & rhs ); // operateur d'addition, l'instance courante n'est jamais modifiee Integer operator+( Integer const & rhs ) const; private: int _n; }; std::ostream & operator<<(std::ostream & o, Integer const & rhs); #endif
le fichier .cpp :
#include <iostream> #include "Integer.class.hpp" Integer::Integer( int const n ) : _n(n) { std::cout << "Constructor called with value : "<< this->_n << std::endl; } Integer::~Integer( void ) { std::cout << "Destructor called with value : "<< this->_n << std::endl; } int Integer::getValue( void ) const { return (this->_n); } Integer & Integer::operator=( Integer const & rhs ) { std::cout << "Assignation operator called from : "<< this->_n; std::cout << " to : "<< rhs.getValue() << std::endl; this->_n = rhs.getValue(); // retourne l'addresse de this, soit la reference return(*this); } Integer Integer::operator+( Integer const & rhs ) const { std::cout << "Addition operator called with : "<< this->_n; std::cout << " and : "<< rhs.getValue() << std::endl; // creation d'une nouvelle instance de la class Integer // pas d'autre solution return Integer(this->_n + rhs.getValue() ); } // surcharge de simple fonction // surcharge de ostream << std::ostream & operator<<( std::ostream & o, Integer const & rhs) { o << rhs.getValue(); return (o); }
Constructor called with value : 30 Constructor called with value : 10 Constructor called with value : 0 Value of x : 30 Value of y : 10 Constructor called with value : 12 Assignation operator called from : 10 to : 12 Destructor called with value : 12 Value of y : 12 Value of z : 0 Addition operator called with : 30 and : 12 Constructor called with value : 42 Assignation operator called from : 0 to : 42 Destructor called with value : 42 Value of z : 42 Destructor called with value : 42 Destructor called with value : 12 Destructor called with value : 30