FAQ C++ BuilderConsultez toutes les FAQ
Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010 Ajouter une question
Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez
Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.
L'équipe C++ Builder de Developpez.
Commentez cette FAQ : Commentez
- 4.1. Types de données (23)
- 4.2. Assembleur (4)
- 4.3. Compilation et édition de liens (11)
- Faut-il apprendre le C avant le C++ ?
- A quoi sert l'opérateur "?:" ? Comment s'en servir ?
- Qu'est ce que NULL ?
- Quelle est la différence entre delete et delete[]
- Pourquoi la syntaxe TYPE ptr** = new TYPE*[taille*sizeof(TYPE)] est-elle erronée ?
- Que signifie __fastcall ?
- Quel est l'équivalent du Assigned(OnEvent) de Delphi avec C++Builder ?
- Comment résoudre l'erreur Windows : "violation d'accès à l'adresse XXXXXXXX"
C'est une question beaucoup débattue. Voici ce que dit Bjarne Stroustrup, le créateur du C++, dans son livre Le Langage C++ :
"La connaissance du C n'est pas un préalable à l'apprentissage du C++. La programmation en C encourage de nombreuses techniques et astuces qui deviennent inutiles en C++, du fait des caractéristiques du langage.
[...]
Mieux vous connaîtrez le langage C, plus il vous semblera difficile d'éviter de faire du C++ dans un style emprunté au C ; si vous tombez dans le piège, vous perdrez au passage les avantages que le C++ aurait pu vous apporter."
L'opérateur ? : retourne une valeur en fonction d'une condition. Il se présente selon la structure suivante : condition?expression1:expression2 où expression1 est retourné si condition est vraie et expression2 si condition s'avère être fausse. Cette syntaxe concise est très pratique, et permet d'éviter des blocs conditionnels if lourds :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | int c; //... if (a < b) c += a; else c += b; |
Code c++ : | Sélectionner tout |
1 2 | int c; c += a < b ? a : b; |
NULL est une rémanence du C. NULL est une macro (souvent #define NULL (void*)0 ou #define NULL 0) utilisée pour le pointeur 0 (pointeur qui ne fait référence à aucun objet).
Les macros ne permettent pas un contrôle de type efficace, bien au contraire. Bjarne Stroustrup, créateur du C++, qualifie NULL d'horrible. Utilisez donc 0 en C++ plutôt que NULL. Si vous souhaitez utiliser NULL, il est conseillé de le définir par :
Code c++ : | Sélectionner tout |
const int NULL = 0;
Code c++ : | Sélectionner tout |
#define NULL 0
Si jamais vous avez alloué un tableau de pointeurs avec new[], utilisez alors delete[] pour libérer la mémoire utilisée par ce tableau. L'utilisation du simple delete ne libérerait pas la mémoire correctement. Dans cet exemple, nous supposons que nous disposons d'une classe TEtoile. On cherche a créer un tableau de X étoiles.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class TForm1 : public TForm { //... public: TEtoile **Etoiles; void ConstruitEtoiles(const int nbetoiles); void LibereEtoiles(); //... }; // Fonction à appeler pour construire nbetoiles TEtoile void ConstruitEtoiles(const int nbetoiles) { Etoiles=new Etoile*[nbetoiles]; for (int i=0; i < nbetoiles; i++) Etoiles[i]=new Etoile; } // Fonction à appeler pour supprimer toutes les étoiles void LibereEtoiles() { for (int i=0; i < nbetoiles; i++) delete Etoiles[i]; delete[] Etoiles; } |
L'opérateur new du C++ est beaucoup plus performant que l'instruction malloc du C. Lorsque vous utilisez cette syntaxe :
Code c++ : | Sélectionner tout |
TYPE ptr** = new TYPE*[taille*sizeof(TYPE)]; // <-- FAUX
Code c++ : | Sélectionner tout |
1 2 | // Pour constuire dynamiquement un tableau de 100 entiers int ptr** = new int*[100*sizeof(int)]; // <-- FAUX |
Code c++ : | Sélectionner tout |
TYPE ptr** = new TYPE*[taille]; // <-- CORRECT
Bien sûr, n'oubliez pas de faire un delete[] pour libérer le tableau ensuite.
Si le nom d'une méthode est précédé de __fastcall, cela signifie que les trois premiers paramètres de la méthode seront placés dans des registres du processeurs (eax, edx et ecx), si leur taille le permet. Cela permet d'accélérer le traitement de certaines méthodes. Evitez de l'utiliser pour des méthodes récursives car les registres devraient être vidés à chaque nouvel appel de la méthode, et donc cette directive perdrait de son intérêt. Selon l'aide, "toutes les méthodes membres d'une classe fiche doivent utiliser la convention __fastcall."
Avec Delphi, pour tester si un gestionnaire d'évènements est assigné, on peut utiliser la syntaxe suivante :
Code delphi : | Sélectionner tout |
1 2 | If (Assigned(OnEvent)) Then OnEvent(Self); |
Code c++ : | Sélectionner tout |
1 2 | if (Objet->OnEvent != NULL) Objet->OnEvent(); |
Qui n'a jamais rencontré cette erreur ? Elle signifie que vous tentez d'accéder à de la mémoire sur laquelle vous n'avez pas de droits.
Le cas classique est la libération de mémoire déjà libérée.
Code c++ : | Sélectionner tout |
1 2 3 | TForm1 *Form = new TForm1(this); delete Form; delete Form; |
Cette erreur peut aussi arriver si un new échoue. Là encore, l'affectation de NULL résout le problème.
Code c++ : | Sélectionner tout |
1 2 3 4 | TForm1 *Form = NULL; Form = new TForm1(this); // Si l'allocation avec new échoue, il n'y aura aucun problème delete Form; |
Code c++ : | Sélectionner tout |
1 2 | TEdit *Edit; Edit->Parent = this; // Erreur : aucun appel à l'opérateur new n'a été fait ! |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.