1 Programmation en C++ Fonctions ● Déclaration et définition de fonctions ● Arguments ● Surcharge ● Arguments optionnels ● Fonctions constantes ● Fonctions opérateurs
2 Type de fonction Fonction float Distance(Point point); Identificateur de fonction (nom) ● Déclaration = spécification de l'identificateur et du type de fonction – Une promesse (un contrat) que la fonction doit tenir (remplir) Argument ● Définition = implantation – La spécification qui remplit le contrat Type de retour + = 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); } Point. h Point.cxx
3 Arguments ● Le passage des arguments peut s'effectuer de plusieurs façons: – Par valeur: – Par référence: – Par pointeur (adresse): – Par référence constante: – Par pointeur de type constant: Type value const Type& value Type& value Type* value const Type* value
4... Arguments... float Distance(Point point); void Handle(int number); ● Le passage des arguments: – Par valeur ● L'objet point (ou number) 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 (fondamentaux) car la procédure de copier l'objet peut être coûteuse (en temps) – Par référence constante ● Le même objet point (ou number) 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(const Point& point); void Handle(const int& number);
5... Arguments ● Si la fonction est destinée à modifier l'objet: – Par référence ● Le même objet point (ou number) 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 (ou number) dont le pointeur est pass é dans la fonction est utilisé par la fonction; il peut alors être modifié float Distance(Point* point); void Handle(int* number); float Distance(Point& point); void Handle(int& number);
6 Arguments ● Le passage des arguments peut s'effectuer de plusieurs façons: – Par valeur: NON – Par référence: OUI – Par pointeur (adresse): OUI – Par référence constante: NON – Par pointeur de type constant: NON Type value const Type& value Type& value Type* value const Type* value Objet peut être modifié
7 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;
8 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 Point point(3,4); std::cout << point.Distance() << std::endl; Point center; std::cout << point.Distance(center) << std::endl; class Point { Point( float x = 0, float y = 0 ); Point(); float Distance( Point point = Point(0, 0) ); }
9... 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 ); }
10 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é
11 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 Point operator + (const Point& p1, const Point& p2); ● 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) { 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;
12 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;