Orienté Objet
Fermé
MonCplusplus
Messages postés
21
Date d'inscription
lundi 23 avril 2018
Statut
Membre
Dernière intervention
9 mars 2019
-
14 déc. 2018 à 00:42
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 27 déc. 2018 à 04:48
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 27 déc. 2018 à 04:48
1 réponse
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
14 déc. 2018 à 14:41
14 déc. 2018 à 14:41
Bonjour,
1. redéfinition des opérateurs
Aucun opérateur n'a un mode "cascade".
Si on écrit
Pour l'opérateur égal, lui aussi a un regroupement à gauche.
Conclusion pour certain opérateurs, c'est possible de les cascader. Pour d'autre ça doit être impérativement évité, si on veut 2 tests d'égalité on les écrits :
2. Table d'objets statiques
On peut tout à fait initialiser les tableaux et les éléments de tableau. Il faut cependant bien comprendre ce qu'il se passe.
1. redéfinition des opérateurs
Aucun opérateur n'a un mode "cascade".
Si on écrit
std::cout << "hello " << "world";, un regroupement est effectué, il est de gauche à droite pour l'opérateur
<<, il se produit donc
(std::cout << "hello ") << "world";, le résultat de l'opérateur retransmets son membre gauche, d'où c'est équivalent à :
std::cout << "hello ", std::cout << "world";
Pour l'opérateur égal, lui aussi a un regroupement à gauche.
obj1==obj2==obj3est donc vu
(obj1==obj2)==obj3. On compare donc obj1 et obj2, et son résultat (qui est true ou false) est ensuite comparé à obj3, ce qui a rarement un sens. Si on essaie
if ( 1 == 2 == 0 ), cela est vrai! car devient
if ( (1==2) == 0 )donc
if ( false == 0 )donc
if ( 0 == 0 ).
Conclusion pour certain opérateurs, c'est possible de les cascader. Pour d'autre ça doit être impérativement évité, si on veut 2 tests d'égalité on les écrits :
if ( 1==2 && 2==0 ).
2. Table d'objets statiques
On peut tout à fait initialiser les tableaux et les éléments de tableau. Il faut cependant bien comprendre ce qu'il se passe.
class Jouet { public: Jouet() {} // cas d'un Jouet sans caractéristique connue Jouet( std::string type , std::string forme ); }; int main() { Jouet jouets[2] { Jouet("guerrier","peluche") , Jouet("guerrier","peluche") }; // Ok Jouet autre[10]; // ok on a pu construire 10 jouets de caractéristiques inconnues (constructeur par défaut) jouets[0] = Jouet("guerrier","peluche"); // ok on a copié un nouveau jouet dans le jouet du tableau (constructeur à 2 paramètres, suivi de l'opérateur de copie) jouets[1] = {"voiture", "plastique"}; // marche aussi depuis 2011 Jouet etAussi[2] { {"guerrier","peluche"} , {"voiture","plastique"} }; // Ok depuis 2011 }Si on supprime la ligne 3, alors la ligne 8 ne compilera plus car on sera incapable de construire des objets sans avoir les données de construction.
16 déc. 2018 à 07:23
16 déc. 2018 à 09:56
Si on utilise une collection de taille adaptative (donc toutes sauf le tableau), là on pourra créer l'objet au moment opportun.
27 déc. 2018 à 04:48