[C++] opérateurs = et ()

Résolu/Fermé
Cainro - 8 déc. 2011 à 16:03
 Cainro - 8 déc. 2011 à 17:59
Bonjour tout le monde,
je suis occupé à apprendre le C++ et j'ai un peu de mal avec ces deux opérateur( = et () ) lors de la déclaration d'une variable, comme par exemple
int x(1);
int x = 1;

j'ai cru comprendre que le but des () était surtout de rendre les déclarations d'objet plus élégante, comme pour un string par exemple
string str("hello")

donc première question, est ce uniquement dans ce but la?
Cependant si ces deux écriture sont équivalente pourquoi je n'ai pas le droit de faire ceci :
int y;
cout << y(5); // alors que cout << y=5; fonctionne

Si quelqu'un pouvait m'éclairer la dessus, Merci !

2 réponses

castors33 Messages postés 49 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 18 octobre 2012 4
8 déc. 2011 à 16:08
Salut,

tu peux seulement utiliser les parenthèses lors de la déclaration de la variable. Ensuite, tu dois utiliser le égal dans le reste du programme
0
oui j'ai bien compris ca, mais j'aimerais surtout savoir pourquoi, j'imagine que si je ne peux utiliser les parenthèses que lors de la déclaration de ma variable il doit bien y avoir une différence entre ces deux operateurs non ?
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
8 déc. 2011 à 16:31
Les parenthèses c'est pour les constructeurs des objets.
Par exemple : Point p1(3,4);
Tu ne peux pas écrire p1 = 3,4 ça n'a pas de sens !

Le signe égal c'est pour l'affectation d'une valeur à une variable. C'est à dire que ce qui est à droite existe, et ce qui est à gauche prend exactement la même valeur.
Par exemple : Point p2 = p1;
Les deux objets p1 et p2 sont structurellement identiques, tu peux les comparer avec ==

En revanche : Point p3(3,4);
Les objets p1 et p3 ont les même valeurs mais ce ne sont pas les mêmes objets, tu ne peux pas les comparer avec == (ça te renverra false)

Ecrire : int x(1); est pour moi une erreur de compréhension de ce que l'on fait, car int n'est pas une classe. Certes le C++ est compréhensif et l'accepte mais en fait il fait int x=1.

Et quand tu fais string str = "hello"; là aussi ça marche parce que le C++ permet de faire des raccourcis dans l'écriture, mais pour être correct il faudrait faire string str("hello")
0
Ok, donc "cout << y(5);" ne fonctionne pas parce qu'il essaie d'appeler le constructeur de y si j'ai bien compris ?
J'ai aussi deux petites questions concernant ta réponse.
1) Je n'ai pour l'instant fait qu'aborder les classes mais il me semble que lorsque je fais
Point p2 = p1
p2 est une vraie copie de p1, pas comme en java par exemple qui crée simplement une référence sur mon objet de base.
Donc, étant donné que j'ai trois objets bien distincts qu'est ce qui fait que p1 et p2 sont comparable alors que p3 ne l'est avec aucun des deux ?
2) Le fait que str = "Hello" fonctionne, c'est vraiment du à C++ qui autorise cette notation, ce n'est pas une surcharge de l'opérateur = dans la classe string ?
0
KX Messages postés 16741 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 30 mai 2024 3 016
8 déc. 2011 à 17:49
J'avoue que je n'utilise plus beaucoup le C++ et que du coup j'ai tendance à réfléchir en Java.
Après vérification :

1) Point p2 = p1.
p2 est une copie champ par champ de p1, mais ce n'est pas une copie en profondeur.
Donc p1, p2 et p3 sont tous distincts, en revanche on ne peut pas faire == si l'opérateur n'a pas été redéfini spécifiquement pour la classe Point.
2) str = "Hello" fonctionne
Effectivement l'opérateur = a été redéfini pour accepter les char* en paramètre, donc cela vient peut-être de ça plus que de la bonne volonté du C++
0
Je te remercie, ca semble un peu moins flou :)
0