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


SommaireLangage (46)
précédent sommaire suivant
 

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."

Mis à jour le 1er septembre 2004 Geronimo

L'opérateur ? : retourne une valeur en fonction d'une condition. Il se présente selon la structure suivante : condition?expression1:expression2expression1 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;
Ce code peut être remplacé par le suivant :

Code c++ : Sélectionner tout
1
2
int c; 
c += a < b ? a : b;
On voit qu'on évite des lignes de code inutiles et que la lisibilité n'en est pas amoindrie, à condition toutefois de réserver cette syntaxe aux tests simples. Il peut en effet devenir fastidieux de lire un code construit uniquement autour de cet opérateur (surtout si plusieurs de ceux-ci sont imbriqués). A utiliser à bon escient donc...

Mis à jour le 1er septembre 2004 Geronimo

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;
A noter que dans C++ Builder, NULL est défini ainsi :

Code c++ : Sélectionner tout
#define NULL 0
La seule différence avec la solution préconisée est que la macro peut-être redéfinie dans le code. Cela générera néanmoins un avertissement. Vous pouvez donc utiliser NULL dans C++ Builder sans arrière-pensées.

Mis à jour le 1er septembre 2004 Geronimo Greybird

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; 
}
Cet exemple permet de créer un tableau de nbetoiles pointeurs sur des TEtoile. L'instruction Etoiles = new Etoile*[nbetoiles]; permet de construire le tableau de pointeurs. Il faut ensuite allouer la mémoire nécessaire à chaque TEtoile, ce que fait la boucle for. La méthode LibereEtoiles fait la démarche inverse : elle libère tous les TEtoile, puis la mémoire utilisée par le tableau à l'aide de delete[].

Mis à jour le 1er septembre 2004 Geronimo

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
Par exemple,

Code c++ : Sélectionner tout
1
2
// Pour constuire dynamiquement un tableau de 100 entiers 
int ptr** = new int*[100*sizeof(int)]; // <-- FAUX
vous construisez non pas un tableau de 100 "lignes", mais un tableau de 100 lignes multipliées par la taille d'un entier. En fait, l'opérateur new connaît la taille des éléments du tableau grâce au type du constructeur :

Code c++ : Sélectionner tout
TYPE ptr** = new TYPE*[taille]; // <-- CORRECT
Ici, c'est le TYPE suivant le new qui détermine la taille des éléments du tableau. La taille détermine le nombre d'éléments du tableau.

Bien sûr, n'oubliez pas de faire un delete[] pour libérer le tableau ensuite.

Mis à jour le 1er septembre 2004 Geronimo

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."

Mis à jour le 1er septembre 2004 Geronimo

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);
Avec C++Builder, la syntaxe équivalente est la suivante :

Code c++ : Sélectionner tout
1
2
if (Objet->OnEvent != NULL) 
      Objet->OnEvent();

Mis à jour le 1er septembre 2004 Geronimo

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;
Pour éviter cette erreur, assignez NULL à vos pointeurs dès leur déclaration, et après chaque delete. Ainsi, il n'y aura aucun risque, car delete NULL ne fait rien.

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;
Enfin, cette erreur peut arriver si vous essayez d'accéder à une zone mémoire non allouée. Le cas typique est celui de la déclaration du pointeur sans new :

Code c++ : Sélectionner tout
1
2
TEdit *Edit; 
Edit->Parent = this; // Erreur : aucun appel à l'opérateur new n'a été fait !
On voit ici que l'attribution de NULL aux pointeurs permet de limiter les risques, mais cela ne doit pas être une solution à vos problèmes : il faut chercher pourquoi le pointeur est déréférencé plusieurs fois et l'éviter le plus possible, il faut chercher pourquoi la création d'un objet échoue, et enfin, il faut veiller à bien allouer la mémoire nécessaire avant d'utiliser un objet.

Mis à jour le 1er septembre 2004 Geronimo

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2020 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.