Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Les mots clefs > Lecture du sujet

Les mots clefs

Rédaction ici

Vous devez être inscrit pour pouvoir poster des messages

Page : Précédente  1  2  3  4  5  6  7  Suivante
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : Précédente  1  2  3  4  5  6  7  Suivante
Hors ligne Hiura # Posté le 03/12/2007 à 19:45:52
Avatar
Groupe : Membres
Reprise du dernier message de la page précédente :
Ok, je vois mieux. Je vais modifier l'exemple en utilisant un opérateur unaire* (j'ai pas mal de soucis avec les deux sortes d'opérateur (binaire et unaire), faut que je relise le passage dans la bible...).

* c'est ce que je maîtrise le mieux alors en attendant d'avoir relu le passage je mets ça, je mettrai l'opérateur binaire (hors de la classe) après.

EDIT : je vais directement faire mieux, je vais mettre un exemple de la bible,

EDIT : ledemonboiteux a posté dans le "mauvais" topic. Mais c'est pas pour ça que je le dis.
J'ai un doute sur l'exemple fournit : ça me semble foireux (je sais même pas si la définition est correcte...). Qu'en pensez vous?
Lien vers le post : http://www.siteduzero.com/forum-83-175473-1950899-les-mots-clefs.html#r1950899
Édité le 04/12/2007 à 16:33:03 par Hiura
 
Hors ligne ledemonboiteux # Posté le 04/12/2007 à 16:43:31
Groupe : Membres
explicit

Description :
Un constructeur à un seul paramètre (ou avec n paramètres dont n-1 ayant des valeurs par défaut) peut être utilisé implicitement par le compilateur pour réaliser une conversion de type (ligne 5) .
Pour interdire ce comportement on utilise le mot clef explicit dans la déclaration du constructeur, qui remplace la précédente (ligne 6)

Langage : C++

Exemple :

Code : C++ - Afficher / masquer les numéros de ligne
  1. class Truc{
  2.           public:
  3.           double Valeur;
  4.           Truc(){valeur = 0;}
  5. /*soit:*/ Truc(int i){valeur = i;}          // Autoriser le typage implicite int --> Truc
  6. /*soit:*/ explicit Truc(int i){valeur = i;} // Interdire le typage implicite int --> Truc
  7. }


Édité le 05/12/2007 à 11:26:05 par ledemonboiteux
Hors ligne Hiura # Posté le 04/12/2007 à 16:45:11
Avatar
Groupe : Membres
Petite faute d'ortho : deuxième commentaire : interdire.
 
Hors ligne lmghs # Posté le 04/12/2007 à 16:49:19
Groupe : Membres
Très Bien -- bien que l'on puisse encore rajouter les "const&".
 
Hors ligne Hiura # Posté le 04/12/2007 à 16:56:45
Avatar
Groupe : Membres
J'ai une question : on doit mettre soit l'une soit l'autre? (je parle des lignes 5 et 6.)
Disons que j'ai du mal à comprendre le concept...

Sinon, pour les opérateur unaire et binaire, il y a une règle pour leur création (du style dans une classe on crée des opérateurs unaires, à l'extérieur on crée des binaires)? J'ai un peu du mal à comprendre Stroustrup dans ses explications...
 
Hors ligne lmghs # Posté le 04/12/2007 à 17:27:58
Groupe : Membres
Une seule.
Le choix sera selon le besoin avéré ou non de disposer de convertions implicites.
 
Hors ligne ledemonboiteux # Posté le 05/12/2007 à 11:26:37
Groupe : Membres
J'ai éditer pour que ce soit plus clair, il faut bien sur choisir une des deux lignes.
Hors ligne Hiura # Posté le 05/12/2007 à 19:48:08
Avatar
Groupe : Membres
Merci lmghs!
Mais j'ai pas compris, pour les unaire et binaire, quand est-ce le mieux pour l'un? pour l'autre "sorte" d'opérateur?

ledemonboiteux : j'ai remis ton mot.
 
Hors ligne MatteX # Posté le 05/12/2007 à 20:23:12
The cake is a lie!
Avatar
Groupe : Membres
Unaire c'est qu'il n'a qu'une seule opérande, binaire il en a 2

comme l'opérateur "*"

Unaire :
Code : C++ - Afficher / masquer les numéros de ligne
  1. appel_valeur( *ptr );


Binaire :
Code : C++ - Afficher / masquer les numéros de ligne
  1. produit = nombre1 * nombre2;

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 
Hors ligne Hiura # Posté le 05/12/2007 à 20:44:00
Avatar
Groupe : Membres
Hors ligne lmghs # Posté le 05/12/2007 à 21:08:41
Groupe : Membres
Et ternaire .. 3 -> ?: (ce n'est pas un smiley)
 
Hors ligne Hiura # Posté le 05/12/2007 à 21:58:02
Avatar
Groupe : Membres
J'ai pas trouvé , il sert à quoi l'opérateur ?: ? (en générale)
 
Hors ligne lmghs # Posté le 06/12/2007 à 11:43:11
Groupe : Membres
C'est un équivalent au if. Mais au lieu de mettre l'accent sur la condition pour faire des traitements différents, il met l'accent sur le fait que l'on veut obtenir le résultat une expression, ou éventuellement d'une autre selon la condition.

Trucs équivalents:
Code : C++ - Afficher / masquer les numéros de ligne
  1. int v;
  2. if (cond) {
  3.    v = f() + g();
  4. } else {
  5.    v = h() + i();
  6. }
  7.  
  8. // ou
  9. int v
  10.     = cond
  11.     ? f() + g()
  12.     : h() + i();

NB: souvent, il y a des gens qui critiquent cet opérateur pour son manque de lisibilité. Avec quelques sauts de lignes bien placés, ce n'est vraiment pas un problème.

Trucs pratiquement propres à chaque approche:
Code : C++ - Afficher / masquer les numéros de ligne
  1. int v;
  2. if (cond) {
  3.    std::cout << "cas1\n";
  4.    v = f() + g();
  5. } else {
  6.    std::cout << "cas2\n";
  7.    v = h() + i();
  8. }
  9.  
  10.  
  11. const int v  // notez le const en plus
  12.     = cond
  13.     ? f() + g()
  14.     : h() + i();
  15. // ou encore:
  16. fct(cond ? f() + g() : h() + i());

Bref, quand les expressions deviennent trop complexes, mieux vaut passer par des variables intermédiaires histoire d'apporter un peu de clarté.
Et quand des traitements doivent être réalisés : pas de question à se poser -> if.
 
Hors ligne Hiura # Posté le 06/12/2007 à 14:59:23
Avatar
Groupe : Membres
A d'accord!
Et comme on ne peut pas le surcharger, faire ça est faux :
Code : C++ - Afficher / masquer les numéros de ligne
  1. MaClasse MonObjet;
  2. MonObjet?:; // faux

Enfin, de toute façon ça n'a aucun sens.

C'est bien ça qu'on appel "expression ternaire"?

(ça m'a troublé car c'est "deux opérateurs" (enfin, il font toujours ensemble, mais noté comme ça :? ça ma troublé..)

Merci pour ces précisions!
 
Hors ligne MatteX # Posté le 06/12/2007 à 15:34:09
The cake is a lie!
Avatar
Groupe : Membres
le classique étant :

Code : C++ - Afficher / masquer les numéros de ligne
  1. int plus_grand( int a, int b );
  2. {
  3.    return (a > b) ? a : b;
  4. }
  5.  
  6. // on peut en faire un template
  7.  
  8. template< typename T >
  9. T plus_grand( T a, T b )
  10. {
  11.     return (a > b) ? a : b;
  12. }


la seule contrainte est que l'opérateur > soit surchargé, ce qui ne posera aucun problème avec les auto concept!

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 
Hors ligne lmghs # Posté le 06/12/2007 à 16:04:29
Groupe : Membres
Il te manque deux opérandes dans ton exemple, huira.
Donc oui, c'est faux.
Mais rien n'empêche de définir un opérateur de convertion sur tes classes qui feront qu'un objet soit testable dans le cadre d'une expression à la booléenne (si je puis dire).
Et après, les deux autres opérandes-expressions pouvant être n'importe quoi, mais du même type, tu peux vraiment écrire n'importe quoi.

Par contre tu ne pourras jamais changer la sémantique de l'opérateur ternaire qui évalue et renvoie (/vaut) l'opérande-expression 2 ou 3 selon le résultat de l'évaluation de l'opérande 1. ( dans "1 ? 2 : 3" )
 
Hors ligne Hiura # Posté le 06/12/2007 à 16:44:12
Avatar
Groupe : Membres
Citation : lmghs
Mais rien n'empêche de définir un opérateur de convertion sur tes classes qui feront qu'un objet soit testable dans le cadre d'une expression à la booléenne (si je puis dire).

tu penses à quoi en particulier? A ça :
Code : C++ - Afficher / masquer les numéros de ligne
  1. MaClasse::operator bool() const;
?
Pour faire qqch comme ça :
Code : C++ - Afficher / masquer les numéros de ligne
  1. MaClasse objet;
  2. objet ? objet.actA() : objet.actB();
?
(où actA et B sont "n'importe quoi")
Édité le 06/12/2007 à 16:54:38 par Hiura
 
Hors ligne lmghs # Posté le 06/12/2007 à 16:48:29
Groupe : Membres
Ce n'est pas la syntaxe (IIRC), mais c'est l'idée.
On en avait parlé (ici), il y a 2-3 semaines (chercher "safe-bool" je crois)
 
Hors ligne Hiura # Posté le 06/12/2007 à 16:53:49
Avatar
Groupe : Membres
Oui, je m'en souviens, je viens de relire le la page que tu avais donnée ( http://www.artima.com/cppsource/safebool.html ). Je corrige mon exemple.
Merci pour la réponse.
 
Hors ligne magnanime # Posté le 07/12/2007 à 16:57:47
Avatar
Groupe : Membres
static_cast
Description : Permet la conversion entre deux types différents.
Langage : C++
Exemple et/ou commentaire :

Code : C++ - Afficher / masquer les numéros de ligne
  1. float flottant = 1.3f;
  2. int entier = static_cast<int>(flottant);//les paranthèses sont necessaires

Ce mot-clé équivaut aux casts C du type:
Code : C++ - Afficher / masquer les numéros de ligne
  1. (int)/*expression*/

mais l'usage de static_cast est conseillé.
Hors ligne Hiura # Posté le 07/12/2007 à 16:59:26
Avatar
Groupe : Membres
Hors ligne lmghs # Posté le 07/12/2007 à 17:24:28
Groupe : Membres
- on ne sait pas de quel cast il s'agit -- façon de parler
- on ne peut pas faire de recherche dessus (grep powa')
- on ne peut pas down-caster (correctement) avec les cast à la C (point de salut hors dynamic_cast)
- il peut y avoir des effets de bors à la noix quand on bosse avec des déclarations anticipées : un /whatever/-casting de pointeur pouvant se voir transformé en reinterpret_cast, et là, c'est le drame.
 
Hors ligne Hiura # Posté le 07/12/2007 à 17:29:27
Avatar
Groupe : Membres
Hors ligne Hiura # Posté le 12/12/2007 à 19:52:16
Avatar
Groupe : Membres
Je propose cette définition (merci de me corriger/approuver).

union
Description : Assez similaire dans l'utilisation et à la création de structure (C), mais la différence réside dans le fait qu'avec une union on ne peut utiliser qu'un seul attribut à la fois, ceci à pour effet de consommer moins de mémoire (la taille de mémoire utilisée est égale à la taille du type qui en prend le plus, pas à l'addition de la place prise par chaque attribut). A noter aussi qu'on ne peut pas mettre de classe dans un union car la construction d'objet y est impossible. Pour plus d'info, il existe ce tuto écrit par slimshady451.
Langage : C & C++
Exemple et/ou commentaire :

Code : C++ - Afficher / masquer les numéros de ligne
  1. #include <iostream>
  2.  
  3. // Création d'un type.
  4. union MonUnion
  5. {
  6.     int entier;
  7.     double reel;
  8. };
  9.  
  10. // Utilisation de l'union.
  11. void f(void)
  12. {
  13.     MonUnion u;
  14.     u.entier = 1300;
  15.     u.reel = 12.5;
  16.     std::cout << "u.reel vaut " << u.reel << std::endl;
  17.     std::cout << "u.entier vaut " << u.entier << std::endl; // ATTENTION : ceci ne va pas afficher 1300!
  18. }


Code : Console - Sorite - Afficher / masquer les numéros de ligne
u.reel vaut 12.5
u.entier vaut 0
Édité le 13/12/2007 à 20:08:09 par Hiura
 
Hors ligne Nanoc # Posté le 13/12/2007 à 19:56:27
Apprenez à utiliser la STL !!
Avatar
Groupe : Membres
Ta définition de l'union me semble correcte et complète. (similaire ne prend pas de y)

-------------------------------------------------------------------------------------------------------

const_cast
Description : Transtypage. Permet de caster un objet déclaré const ou volatile en un objet de même type mais pas constant.
Langage : C++
Exemple et/ou commentaire : Code : C++ - Afficher / masquer les numéros de ligne
  1. const int a=12; //Déclaration d'un entier constant
  2. int* b = const_cast<int*>(&a);  //Cast de a

Remarque: Ce mot-clé n'est normalement jamais nécessaire. Son utilisation est souvent le signe d'une mauvaise conception.
-------------------------------------------------------------------------------------------------------

static_cast
Description : Transtypage. Permet de caster un objet dans un autre objet si les types sont compatibles.
Langage : C++
Exemple et/ou commentaire : Code : C++ - Afficher / masquer les numéros de ligne
  1. int a=12; //Déclaration d'un entier
  2. char b = static_cast<char>(a);  //Cast de a en caractère

Remarque: Les conversions sont faites lors de la compilation. Il n'y a donc pas de test durant l'exécution qui pourrait lever une exception.

-------------------------------------------------------------------------------------------------------

reinterpret_cast
Description : Transtypage. Permet de réinterpréter autrement less données. On peut ainsi redescendre jusqu'à la représentation binaire des données.
Langage : C++
Exemple et/ou commentaire : Code : C++ - Afficher / masquer les numéros de ligne
  1. int a=123456; //Déclaration d'un entier
  2. cha* b = reinterpret_cast<char*>(&a);  //On convertit a en pointeur sur un caractère.
  3. //On obtient ainsi une séquence d'octets que l'on peut par exemple utiliser pour les fonctions
  4. // d'entrée-sortie binaire. Cette séquence d'octets correspond à l'entier tel qu'il est stocké
  5. //en mémoire.


-------------------------------------------------------------------------------------------------------
Pour le dynamic_cast, faut que je réfléchisse à un truc simple... :-°
-------------------------------------------------------------------------------------------------------

return
Description : Instruction qui indique la fin d'une fonction. La suite du programme saute alors à l'endroit où la fonction a été appelée. return peut être suivit d'une expression selon que la fonction doit renvoyer une valeur ou non.
Langage : C et C++
Exemple et/ou commentaire : Code : C++ - Afficher / masquer les numéros de ligne
  1. int surfaceRectangle(int a,intb) //Fonction qui calcule la surface d'un rectangle
  2. {
  3.    return a*b;  //On termine la fonction en renvoyant le produit a*b
  4. }

Remarque: Il peut y avoir plusieurs return par fonction, mais la fonction se termine au premier return rencontré.

-------------------------------------------------------------------------------------------------------

wchar_t
Description : Type de variable, ressemblant aux char, pouvant contenir une valeur plus grande que ces derniers. Ceci permet par exemple de manipuler les caractères avec accents.
Langage : C++
Exemple et/ou commentaire : Code : C++ - Afficher / masquer les numéros de ligne
  1. wchar_t monCaractere = 'a'; //Un caractère long

Remarque: Ce type existe aussi en C, mais il ne fait pas partie du standard.
Édité le 15/12/2007 à 10:30:56 par Nanoc
 
Hors ligne smilz # Posté le 13/12/2007 à 20:03:37
La vie est une blague
Avatar
Groupe : Membres
Pour le return, précise que 1 seul return est exécuter par contre. Dès qu'un return est rencontré, le programme quitte la fonction.

Maman a apporté les piles !
Les piles longue durée !
Maman a apporté les piles !
Alors plus de télé !
 
Hors ligne Hiura # Posté le 13/12/2007 à 20:08:33
Avatar
Groupe : Membres
Hors ligne lmghs # Posté le 13/12/2007 à 21:58:23
Groupe : Membres
const_cast sert à faire sauter les /cv-modifiers/. c comme const, v comme volatile.

reinterpret_cast porte très bien son nom : il sert à interpréter autrement des données. Limite en redescendant jusqu'à leur représentation binaire -- j'ai pas de meilleure formulation qui me viennent à l'esprit pour l'instant.
Un meilleur exemple aurait été de passer de "int i=42;" à "reinterpret_cast<char*>(&i)", qui permet d'obtenir un pointeur sur un séquence d'octets que l'on peut balancer aux fonctions d'I/O binaires; séquence d'octets qui correspond à l'entier tel qu'il est stocké en mémoire.

dynamic_cast -> lié eu polymorphisme d'inclusion. Essentiellement utile pour downcaster (souvent le signe d'une mauvaise manipulation sorti de quelques cas (comme à la sortie d'une désérialization, d'une factory; pour faire du multi-dispatch... ; soit des trucs rarement recherchés par des débutants en OO, d'où le "souvent signe ...." ), ou crosscaster. Il a des prérequis pour pouvoir être employé.
Il y a des subtilités entre lui et static_cast que l'on retrouvent dans quantités de cours.
 
Hors ligne MatteX # Posté le 13/12/2007 à 22:27:16
The cake is a lie!
Avatar
Groupe : Membres
return : une fonction?

return est une simple instruction comme if, while, etc...

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 
Hors ligne magnanime # Posté le 14/12/2007 à 14:10:15
Avatar
Groupe : Membres
if et while sont des groupes d'instructions, return s'apparente plus à
break, continue et throw. Mais bon, c'est ce que MatteX voulais dire
je suppose.
Hors ligne MatteX # Posté le 14/12/2007 à 14:53:36
The cake is a lie!
Avatar
Groupe : Membres
Effectivement, return est une instruction de saut (traduction à la main de "Jump Statement") comme ses trois confrères alors que if est une instruction conditionnelle et while une instruction itérative....

Il reste que ce ne sont pas des fonctions!


J'aimerais ajouter qu'il existe aussi goto dans les "Jump Statement" (ok ok! pas d'attaque. On ne peux lui empêcher d'exister ce mot-clé, c'est le grand-père des boucles!)

liens utiles: FAQ C++ (developpez.com) | GotAPI.com | H-Deb
Mon futur ex-blog | Logique : http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
Propriétaire d'un Dell Inspiron 1720, Core 2 Duo 2.4Ghz, 3Go DDR2, 8600M GT 256Mo. Avec Blu-Ray!
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 46 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.1063s (0.0914s)