Programmation en C++ Fonctions Déclaration et définition de fonctions Arguments Surcharge Arguments optionnels Fonctions constantes Fonctions opérateurs
Fonction Déclaration = spécification de l'identificateur et du type de fonction Une promesse (un contrat) que la fonction doit tenir (remplir) Définition = implantation La spécification qui remplit le contrat Point.cxx float Point::Distance(Point point) { /// Calculer la distance du point donné float x_diff = m_x – point.m_x; float y_diff = m_y – point.m_y; return sqrt(x_diff*x_diff + (x_diff*x_diff); } Identificateur de fonction (nom) Point.h float Distance(Point point); Type de retour + Argument = Type de fonction
Arguments ... Le passage des arguments peut s'effectuer de plusieurs façons: Par valeur L'objet « point » passé dans la fonction est copié localement dans un nouvel objet qui est utilisé par la fonction L'objet d'origine ne peut pas être modifié par la fonction Appropriée que pour des objets de types simple (primitifs) car la procédure de copier l'objet peut être coûteuse (en temps) Par référence constante Le même objet « point » dont la référence est passée dans la fonction est utilisé par la fonction La déclaration const nous garantit que l'objet ne peut pas être modifié par la fonction Évite la nécessité de copier l'objet, elle est alors appropriée pour les objets de types complexes (classe) float Distance(Point point); float Distance(const Point& point);
... Arguments Si la fonction est destinée à modifier l'objet: Par référence Le même objet « point » dont la référence est passée dans la fonction est utilisé par la fonction; il peut alors être modifié Par adresse (pointeur) Le même objet « point » dont le pointeur est passé dans la fonction est utilisé par la fonction; il peut alors être modifié float Distance(Point& point); float Distance(Point* point);
Surcharge de sélection Plusieurs fonctions avec le même nom peuvent coexister à condition que la liste des arguments diffère: Les fonctions ne peuvent pas différer seulement par le type de retour Utilisation La sélection de fonction est faite par le compilateur class Point { float Distance(Point point); // Distance a partir d'un point float Distance(Line line); // Distance a partir d'une ligne float Distance(Point p1, Point p2); // Distance a partir d'une ligne // définie par deux points p1, p2 double Distance(Line line); // Distance a partir dune ligne } Point point(3,4); Point center(0,0); Line line; std::cout << point.Distance(center) << std::endl; std::cout << point.Distance(line) << std::endl;
Arguments optionnels ... Il est possible de donner à un argument sa valeur par défaut: Les arguments par défaut ne peuvent pas introduire d'ambiguïté – le constructeur par défaut (sans arguments) est déclaré déjà avec le constructeur par deux floats Utilisation class Point { Point( float x = 0, float y = 0 ); Point(); float Distance( Point point = Point(0, 0) ); } Point point(3,4); std::cout << point.Distance() << std::endl; Point center; std::cout << point.Distance(center) << std::endl;
... Arguments optionnels Les arguments avec des valeurs par défaut doivent toujours se trouver à droite des arguments sans valeur par défaut class Point { Point( float x = 0, float y = 0 ); Point( float x, float y = 0 ); Point( float x = 0, float y ); }
Fonctions constantes La déclaration const de la fonction membre de la classe nous garantit que la fonction ne change pas les données membres de la classe Les fonctions qui ne doivent pas changer l'état de la classe: Les fonctions pour accéder à l'état de l'objet Pour les autres c'est à décider par le programmeur class Point { public: // Fonctions pour construire l'objet Point(); Point(float x, float y); // Fonctions pour manipuler l'objet float Distance(const Point& point) const; // Fonctions pour accéder à l'état de l'objet float GetX() const; float GetY() const; private: // Données membres float m_x; float m_y; }; Notre définition de la classe Point après l'application de const où c'est approprié
Fonctions Opérateurs On peut regarder l'opérateur comme un raccourci pour un appel de fonction: c = a + b; parait plus clair que c = Add(a,b); En C++, les opérateurs sont spécifiés (déclarés) et implantés (définis) comme fonctions, mais utilisés comme opérateurs Déclaration: Utilisation: Définition: En C++, le programmeur peut redéfinir la plupart des opérateurs, mais pas tous (ex. opérateur ., :: ) Point operator + (const Point& p1, const Point& p2); Point operator + (const Point& p1, const Point& p2) { return Point ( p1.GetX() + p2.GetX(), p1.GetY() + p2.GetY() ); } Point p1(3,4); Point p2(1,5); Point p3 = p1 + p2; std::cout << p3 << std::endl; Type de fonction
Opérateurs I/O Les opérateurs <<, >> permettent d'envoyer un objet dans un flot d'entrée ou de sortie Déclaration: Déclarer l'opérateur friend permet d'accéder aux données membres privées Implémentation: Utilisation: class Point { friend std::ostream& operator << (std::ostream& s, const Point& point); }; std::ostream& operator << (std::ostream& s, const Point& point) { s << "Point: " << point.m_x << “, “ << point.m_y; return (s); } Point p5(10, 15); std::cout << p5 << std::endl;