FAQ C++Consultez toutes les FAQ
Nombre d'auteurs : 34, nombre de questions : 368, dernière mise à jour : 14 novembre 2021
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur ou si vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
-
1. Généralités sur le C++
(26)
-
1.1. Caractéristiques du langage
(8)
- Quelles sont les caractéristiques du langage C++ ?
- Le C++ assure-t-il la compatibilité avec le C ?
- Quelques caractéristiques du langage C++ d'un point de vue « business » ?
- C++ est-il un langage parfait ?
- Le C++ est-il un meilleur langage que… ?
- Le C++ est-il un langage pratique ?
- Qui utilise le C++ ?
- Puis-je utiliser des bibliothèques écrites en C dans mes programmes C++ ?
-
1.2. Guide de démarrage
(9)
- Que faut-il savoir avant de commencer en C++ ?
- Combien de temps faut-il pour apprendre le C++ ?
- Dois-je apprendre le C avant le C++ ?
- Où trouver de la documentation de référence sur le C++ ?
- Où trouver un compilateur C++ ?
- Quel livre acheter ou lire ?
- Où puis-je trouver des cours à télécharger et à consulter ?
- Où trouver la solution des exercices du livre « Le langage C++ » de Stroustrup ?
- Au secours, à l'aide, j'ai une erreur ! Que faire ?
- 1.3. Bibliothèques complémentaires (4)
- 1.4. Norme (5)
-
1.1. Caractéristiques du langage
(8)
- 2. Information générale (6)
-
3. Organisation du code source
(7)
- Quels fichiers d'en-tête dois-je inclure ?
- Où dois-je inclure les fichiers d'en-tête ?
- Dans quel ordre dois-je mettre mes fichiers d'en-tête ?
- Comment structurer ma classe en un fichier .h et un fichier .cpp ?
- Comment faire avec les templates ?
- Comment vérifier que mon fichier d'en-tête peut être inclus indépendamment de tout autre ?
- Et avec les en-têtes précompilés ?
- 4. Le langage C++ (4)
-
5. Les chaînes de caractères : std::string
(28)
-
5.1. Conversions
(8)
- Comment convertir un char* en un string ?
- Comment convertir une string en char* ?
- Comment convertir un nombre en une string ?
- Comment convertir une string en un entier ?
- Comment convertir n'importe quel type d'objets en string ?
- Comment convertir une string en un objet de n'importe quel type ?
- Comment convertir une string en minuscules/majuscules ?
- [Piège] Comment initialiser/affecter un nombre à une string ?
- Y a-t-il un type chaîne de caractères en C++ ?
- Quels sont les avantages de std::string par rapport à char* ?
- Utiliser string n'est-il pas plus lent ?
- Dans quels cas ne faut-il pas utiliser string ?
- Quelle est la différence entre char*, const char* et char const * ?
- Quelle est la différence entre #include <string> et #include <string.h> ?
- Quelle est la différence entre string::length() et string::size() ?
- Quelle différence entre string::size() et string::capacity() ?
- Quelle est la différence entre string::data() et string::c_str() ?
- Quelles précautions faut-il prendre avec string::c_str() et string::data() ?
- Quelle est la différence entre string::find() et string::find_first_of() ?
- Comment déterminer si une chaîne contient une valeur d'un certain type ?
- Comment manipuler des chaînes de caractères ne tenant pas compte de la casse ?
- Comment inverser le contenu d'une chaîne ?
- Comment découper une chaîne en fonction d'un séparateur ?
- Comment tester des chaînes de caractères dans un bloc switch ?
- Comment manipuler des chaînes de caractères Unicode ?
- Comment effectuer les conversions de texte ASCII < - > Unicode ?
- [Exemple] Comment supprimer des caractères d'une string ?
- [Exemple] Comment manipuler un tableau de string ?
-
5.1. Conversions
(8)
-
6. La STL
(15)
-
6.1. Conteneurs
(8)
- Qu'est-ce qu'un conteneur ?
- Qu'est-ce qu'un itérateur ?
- Quel conteneur choisir pour stocker mes objets ?
- Comment utiliser correctement les conteneurs standards avec du code C ?
- Comment créer et utiliser un tableau avec std::vector ?
- Dois-je détruire ce que j'ai stocké dans un vecteur ?
- Comment supprimer correctement des éléments d'un conteneur ?
- [Exemple] Comment détruire les pointeurs d'un conteneur ?
- 6.2. Algorithmes (3)
-
6.1. Conteneurs
(8)
-
7. Les références
(6)
- Qu'est-ce qu'une référence ?
- Que se passe-t-il si on assigne une autre valeur à la référence ?
- Que se passe-t-il en cas de retour d'une référence lors de l'appel d'une fonction ?
- Comment faire pour modifier une référence de façon qu'elle désigne un autre objet ?
- Quand utiliser des références et quand utiliser des pointeurs ?
- Qu'est-ce qu'un handle sur un objet ? une référence ? un pointeur ? un pointeur sur un pointeur ?
-
8. Les fonctions
(19)
-
8.1. Les fonctions inline
(8)
- Que se passe-t-il avec les fonctions inline ?
- Un exemple simple d'intégration
- Les fonctions inline améliorent-elles les performances ?
- Comment les fonctions inline peuvent-elles influer sur le compromis vitesse/sécurité ?
- Pourquoi utiliser une fonction inline au lieu d'une macro #define ?
- Comment signaler au compilateur de mettre une fonction non membre inline ?
- Comment signaler au compilateur de mettre une fonction membre inline ?
- Y a-t-il un autre moyen de spécifier une fonction membre inline ?
- 8.2. Optimisation (5)
- Comment passer correctement des paramètres à ma fonction ?
- Qu'est-ce que la surcharge ?
- Quel est l'équivalent C++ des paramètres variables ?
- Quelles précautions faut-il prendre avec les fonctions callback ?
- Pourquoi ne faut-il qu'un seul return par fonction ?
- Où dois-je déclarer mes variables locales ?
-
8.1. Les fonctions inline
(8)
-
9. Programmation objet en C++
(23)
- Quels sont les enjeux associés aux techniques Orientées Objets ?
- Qu'est-ce qu'un objet ?
- Qu'est-ce que l'héritage ?
- Qu'est-ce que l'encapsulation ?
- L'encapsulation constitue-t-elle un mécanisme de sécurité ?
- Comment le C++ permet-il d'améliorer le compromis entre fiabilité et simplicité d'utilisation ?
- Comment savoir si je dois dériver une classe ou l'encapsuler ?
- Qu'est-ce qu'une bonne interface ?
- Que sont les accesseurs / mutateurs ?
- Quand et comment faut-il utiliser des accesseurs / mutateurs ?
- La conception d'une classe doit-elle se faire plutôt par l'extérieur ou par l'intérieur ?
- Qu'est-ce que le polymorphisme ?
- Qu'est-ce que la coercition ?
- Qu'est-ce que le polymorphisme paramétrique ?
- Qu'est-ce que le polymorphisme d'inclusion ?
- Qu'est-ce qui est entendu par « paramétrer un comportement » ?
- Comment varier le comportement au moment de l'exécution par le polymorphisme d'inclusion ?
- Comment varier le comportement au moment de l'écriture de code (template) ?
- Comment varier le comportement à la compilation par les directives du préprocesseur ?
- Comment varier le comportement à l'édition des liens ?
- Comment varier le comportement à l'exécution par le chargement dynamique de bibliothèque ?
- Comment varier le comportement au moment de l'exécution par agrégation ?
- Comment choisir entre les différents types de paramétrage de comportement ?
-
10. Les classes en C++
(99)
-
10.1. Les constructeurs
(17)
- Qu'est-ce qu'un constructeur ?
- Qu'est-ce qu'un constructeur par défaut ?
- Quand dois-je définir un constructeur par défaut ?
- Qu'est-ce qu'un constructeur de copie ?
- Quand dois-je définir un constructeur par copie ?
- Quelles sont les différences fondamentales entre le constructeur d'une classe et sa méthode Init() ?
- Y a-t-il une différence quelconque entre MaClasse x; et MaClasse x(); ?
- Un constructeur d'une classe peut-il appeler un autre constructeur de la même classe pour initialiser 'this' ?
- Est-ce que le constructeur par défaut pour Fred est toujours Fred::Fred() ?
- Quel constructeur est appelé quand je crée un tableau d'objets Fred ?
- Mes constructeurs doivent-ils utiliser les listes d'initialisation ou l'affectation ?
- Puis-je utiliser le pointeur this dans un constructeur ?
- Qu'est-ce que l'idiome du constructeur nommé (Named Constructor) ?
- Que faire en cas d'échec du constructeur ?
- Qu'est-ce que « l'idiome des paramètres nommés » ?
- Dans quel ordre sont construits les différents composants d'une classe ?
- Puis-je appeler des fonctions virtuelles dans le constructeur (ou le destructeur) ?
-
10.2. Les destructeurs
(12)
- Qu'est-ce qu'un destructeur ?
- Quand dois-je définir un destructeur ?
- Pourquoi et quand faut-il créer un destructeur virtuel ?
- Est-il possible d'invoquer explicitement le destructeur d'une classe ?
- Dans quel ordre les objets locaux sont-ils détruits ?
- Dans quel ordre les objets contenus dans un tableau sont-ils détruits ?
- Doit-on détruire explicitement les objets locaux ?
- Et si on veut absolument qu'un objet local « meure » avant l'accolade fermant le bloc dans lequel il a été créé ?
- Et s'il n'est pas possible de placer l'objet local dans un bloc artificiel ?
- Peut-on détruire explicitement un objet alloué par new ?
- Dans le code d'un destructeur, doit-on détruire explicitement les objets membres ?
- Dans le code du destructeur d'une classe dérivée, doit-on appeler explicitement le destructeur de la classe de base ?
-
10.3. La surcharge d'opérateurs
(18)
- Qu'est-ce que la surcharge d'opérateur ?
- Quel est l'avantage de surcharger un opérateur ?
- Quelques exemples de surcharge d'opérateur
- Quels opérateurs peut-on ou ne peut-on pas surcharger ?
- J'ai pour surcharger mon opérateur la possibilité d'utiliser une fonction membre ou une fonction libre, que choisir ?
- La surcharge d'opérateur n'embellit pas vraiment ma classe ; ce n'est pas censé rendre le code plus lisible ?
- Quand dois-je définir l'opérateur d'affectation ?
- Comment écrire un opérateur d'affectation correct ?
- Qu'est-ce que l'auto-affectation ?
- Peut-on surcharger operator== de façon qu'il compare deux char[] en faisant une comparaison de chaîne ?
- Peut-on définir un operator** qui calcule « x à la puissance y » ?
- Comment implémenter un opérateur d'indexation pour une classe Matrix ?
- Pourquoi est-il préférable que l'interface de ma classe Matrix ne soit pas basée sur le modèle du tableau de tableaux ?
- Comment surcharger les opérateurs ++ et -- ?
- Qu'est-ce qui est le plus rapide : i++ ou ++i ?
- Comment surcharger correctement l'opérateur == ?
- Comment surcharger correctement l'opérateur < ?
- Comment surcharger correctement l'opérateur << pour afficher des objets polymorphes ?
-
10.4. Les fonctions membres virtuelles
(6)
- Que signifie le mot-clé virtual ?
- Pouvez-vous me donner une raison simple pour laquelle la virtualité est si importante ?
- Les fonctions virtuelles sont-elles un mécanisme important en C++ ?
- Qu'est-ce qu'une fonction virtuelle pure ?
- Qu'est-ce qu'un type de retour covariant ?
- Puis-je appeler des fonctions virtuelles dans le constructeur (ou le destructeur) ?
-
10.5. Les amis (friend)
(7)
- Que signifie « friend » ?
- Les amis brisent-ils l'encapsulation ?
- Quels avantages/désavantages y a-t-il à utiliser des fonctions friend ?
- Que signifie « l'amitié n'est ni héritée ni transitive, ni réciproque » ?
- Doit-on utiliser plutôt des fonctions membres ou plutôt des fonctions friend ?
- Comment déclarer une fonction amie avec une classe template ?
- Comment déclarer amies l'ensemble des classes issues d'un même modèle ?
-
10.6. Les données et fonctions membres statiques
(10)
- Quelle est la particularité d'une fonction membre static ?
- Que signifie la déclaration suivante : « static const int MAX = 10 » ?
- Pourquoi déclarer un membre static dans une classe ?
- Comment initialiser un membre static ?
- Pourquoi les classes avec des membres statiques me donnent-elles des erreurs lors de l'édition des liens ?
- Qu'est-ce que le « fiasco dans l'ordre d'initialisation des variables statiques » ?
- Comment puis-je éviter le « fiasco dans l'ordre d'initialisation des variables statiques » ?
- Pourquoi l'idiome de construction à la première utilisation utilise-t-il un pointeur statique plutôt qu'un objet statique ?
- Comment puis-je éviter le « fiasco dans l'ordre d'initialisation des variables statiques » pour les données membres statiques ?
- Dois-je me préoccuper du « fiasco dans l'ordre d'initialisation des variables statiques » pour les types de base ?
-
10.7. Sémantique de copie
(7)
- Qu'est-ce qu'une classe copiable ?
- Je n'ai pas de constructeur par copie ni d'opérateur d'affectation (operator=) : ma classe est-elle copiable ?
- Toute classe doit-elle être copiable ?
- Comment rendre une classe non copiable ?
- Que se passe-t-il pour les classes dérivées d'une classe non copiable ?
- Quelle solution préférer (héritage ou redéfinition) pour rendre une classe non copiable ?
- Comment rendre une classe non copiable en C++0x ?
- 10.8. référencce (0)
- Qu'est-ce qu'une classe ?
- Qu'est-ce qu'une classe abstraite ?
- Quand est-ce qu'une classe a une sémantique de valeur ?
- Quand est-ce qu'une classe a une sémantique d'entité ?
- Quelle forme canonique adopter en fonction de la sémantique de la classe ?
- Qu'est-ce que la forme canonique orthodoxe de Coplien ?
- Que conclure de la forme canonique orthodoxe de Coplien ?
- Qu'est-ce que la règle des grands trois (Big rule of three) ?
- Comment structurer ma classe en un fichier .h et un fichier .cpp ?
- Comment créer deux classes qui font référence l'une à l'autre ?
- Comment puis-je empêcher les autres programmeurs de violer l'encapsulation en accédant aux membres privés de mes classes ?
- Comment dériver une classe à partir d'une autre ?
- Comment faire pour empêcher de créer plus d'une instance d'une classe ?
- Qu'est-ce « this » ?
- Que signifient public, private et protected ?
- Quelle est la différence entre class et struct ?
- Que signifie objet.fonction1().fonction2() ? (chaînage de fonctions)
- Comment effectuer la copie d'objets polymorphes ?
- Pourquoi certaines fonctions membres possèdent le mot clé const après leur nom ?
- Qu'est-ce que le masquage de fonction (name hiding) ?
- Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?
- La fonction de ma classe entre en conflit avec une fonction standard, que faire ?
-
10.1. Les constructeurs
(17)
-
11. L'héritage
(13)
- Pourquoi mettre en œuvre un héritage ?
- Quand dois-je faire un héritage public ? protégé ? privé ?
- Qu'est-ce que le LSP ?
- Héritage EST-UN et programmation par contrat
- Pourquoi le destructeur d'une classe de base doit être public et virtuel ou protégé et non virtuel ?
- Qu'est-ce qu'une classe abstraite ?
- Qu'est-ce que l'héritage virtuel et quelle est son utilité ?
- Dans quel ordre sont construits les différents composants d'une classe ?
- Qu'est-ce que le polymorphisme ?
- Mes fonctions virtuelles doivent-elles être publiques, protégées, ou privées ? Le pattern NVI
- Comment varier le comportement au moment de l'exécution par le polymorphisme d'inclusion ?
- Puis-je appeler des fonctions virtuelles dans le constructeur (ou le destructeur) ?
- Que sont le typage statique et le typage dynamique ? Question subsidiaire : qu'est-ce que l'inférence de type ?
-
12. Gestion dynamique de la mémoire
(21)
- 12.1. Les pointeurs intelligents (2)
- Comment allouer de la mémoire ?
- Que se passe-t-il si new ne parvient pas à allouer la mémoire demandée ?
- Pourquoi utiliser new plutôt que malloc ?
- Comment libérer de la mémoire ?
- Que se passe-t-il si je fais un delete sur un pointeur qui vaut NULL ?
- Puis-je utiliser free() pour libérer un pointeur alloué par new ?
- Pourquoi devrais-je utiliser array/vector<T> au lieu de gérer la mémoire d'un tableau moi-même ?
- Comment allouer dynamiquement un tableau ?
- Comment libérer un tableau alloué dynamiquement ?
- Comment allouer dynamiquement un tableau à plusieurs dimensions ?
- Comment libérer un tableau à plusieurs dimensions alloué dynamiquement ?
- Comment réallouer/agrandir une zone mémoire ?
- Comment récupérer la taille d'un tableau dynamique ?
- Peut-on déréférencer un pointeur NULL ?
- Est-il possible de forcer new à allouer la mémoire à une adresse précise ?
- Qu'est-ce que « placement new » et dans quels cas l'utilise-t-on ?
- Comment gérer proprement des allocations/désallocations de ressources ? Le RAII !
- Comment se gère la constance avec les pointeurs ?
- Quels sont les dangers liés à l'utilisation des pointeurs ?
- 13. Les namespaces (5)
-
14. Utilisation des exceptions
(13)
- Qu'est-ce qu'une exception ?
- Comment lever une exception ?
- Comment capturer les exceptions dans mon code ?
- Pourquoi faut-il capturer les exceptions par référence ?
- Est-il possible de capturer plusieurs exceptions dans un seul catch ?
- Comment relancer une exception que l'on a capturé ?
- Que se passe-t-il si aucun bloc catch n'existe pour traiter une exception ?
- Comment créer son propre type d'exception ?
- Peut-on lever des exceptions dans les constructeurs ?
- Peut-on lever des exceptions dans les destructeurs ?
- [C++11] Comment indiquer qu'une fonction ne lève jamais d'exception ?
- [C++98] Comment indiquer qu'une fonction ne lève jamais d'exception ?
- Quel est l'équivalent C++ du bloc finally des autres langages ?
-
15. Entrées / sorties avec les flux
(35)
-
15.1. Manipulation de la console
(8)
- Quelle est la différence entre #include <iostream.h> et #include <iostream> ?
- cout n'est pas reconnu à la compilation, que se passe-t-il ?
- Comment saisir une chaîne contenant des espaces ?
- Pourquoi std::getline ne lit-il rien, et faut-il l'exécuter deux fois pour que la ligne soit lue ?
- Comment purger le buffer clavier ?
- Comment vérifier les valeurs saisies avec cin ?
- Est-il possible de simuler une saisie clavier ?
- Comment faire une pause (attendre que l'utilisateur tape une touche) ?
-
15.2. Manipulation des fichiers
(14)
- Comment tester l'existence d'un fichier ?
- Comment savoir si la lecture / écriture dans un fichier a réussi ?
- Comment écrire à la suite d'un fichier existant ?
- Comment détecter la fin de fichier lors de la lecture ?
- Comment calculer la taille d'un fichier ?
- Comment fonctionnent les tests d'ouverture de fichier if ( fichier ) et if ( !fichier ) ?
- Comment faire pour lire un fichier ligne par ligne ?
- Comment lire l'intégralité d'un fichier texte dans un buffer ?
- Comment compter le nombre de lignes d'un fichier ?
- Pourquoi n'ai-je pas le nombre de caractères attendus avec mon fichier ?
- Comment effectuer des lectures / écritures binaires dans un fichier ?
- [Exemple] Comment manipuler un nom de fichier avec string ?
- Pourquoi la lecture de mon fichier ne fonctionne-t-elle plus après une lecture complète ?
- Pourquoi je n'arrive plus à rien lire après avoir atteint la fin de mon fichier, même après un « file.seekg (0, file.beg); » ?
- 15.3. Représentation - Formatage (4)
- À quoi sert std::endl ?
- Comment utiliser les flux pour afficher ou saisir mes objets ?
- Comment effacer le contenu d'un ostringstream ?
- [Exemple] Comment convertir un tableau en chaîne ?
- Comment rediriger l'entrée ou la sortie standard ?
- Comment utiliser les itérateurs de flux ?
- Comment fonctionne le test de réussite de conversion if ( str >> num ) ?
- Qu'est-ce qu'un tampon, un buffer ?
- Que signifie vider ou purger un tampon ?
-
15.1. Manipulation de la console
(8)
-
16. Les templates
(18)
- Qu'est-ce qu'un template ?
- Comment créer une fonction template ?
- Comment créer une classe template ?
- Qu'est-ce que la spécialisation de template ?
- Quelle différence y a-t-il entre template <class> et template <typename> ?
- Qu'est-ce que la détermination automatique des paramètres templates ?
- Pourquoi mes templates ne sont-ils pas reconnus à l'édition des liens ?
- À quoi sert le mot-clé typename ?
- Peut-on créer un alias (typedef) sur des templates ?
- Qu'est-ce qu'une classe de trait ? Comment l'utiliser ?
- Qu'est-ce qu'une classe de politique ? Comment l'utiliser ?
- Comment dériver une classe d'une classe template ?
- Qu'est-ce que le CRTP ?
- Qu'est-ce que SFINAE ?
- Comment puis-je créer une classe dont la structure peut varier ?
- Comment varier le comportement au moment de l'écriture de code (template) ?
- Comment utiliser un membre/méthode template d'un paramètre template ?
- Comment accéder aux membres d'une classe mère template ?
-
17. Boost
(12)
- Qu'est-ce que Boost ?
- Comment installer boost ?
- Où trouver de la documentation sur Boost ?
- Comment utiliser les pointeurs intelligents de Boost ?
- Quelles sont les possibilités de casting sur un shared_ptr ?
- Quels sont les possibilités de conversion (casting) proposées par Boost ?
- Comment découper une chaîne avec boost::tokenizer ?
- [Exemple] Comment détruire les pointeurs d'un conteneur en utilisant Boost ?
- Qu'est-ce que Boost.Variant ?
- Comment récupérer la valeur contenue dans un boost::variant ?
- Qu'est-ce que boost::any et boost::variant et quand les utiliser ?
- Peut-on utiliser la bibliothèque boost avec Visual C++ ?
-
18. Divers
(9)
- Comment exécuter une commande système ou un autre programme ?
- Quelles sont les questions à poser pour savoir si un candidat connaît vraiment son sujet ?
- Comment accélérer la compilation de mes projets ?
- Mes calculs sur nombres flottants sont imprécis, que faire ?
- Comment connaître les macros prédéfinies pour les différentes plateformes ?
- Que sont les rvalues et lvalues ?
- Qu'est-ce que le mot-clef volatile ?
- Qu'est-ce que l'immuabilité ?
- Comment charger explicitement une bibliothèque dynamique ?
-
19. Problèmes avec les compilateurs
(9)
- Mon programme plante ou se comporte bizarrement.
- Mon programme se lance et se termine immédiatement sans que je ne puisse rien voir.
- Mon programme C++ compile parfaitement avec gcc 2.x, et marque pleins d'erreurs avec gcc 3.x
- Devcpp se plaint de ne pas connaître le format de mon .lib
- Erreur « symbole externe non résolu _WinMain@16 référencé dans la fonction _WinMainCRTStartup »
- La STL livrée avec Visual C++ 6 est boguée !
- Erreur C1010 avec Visual C++
- J'ai un problème avec Visual C++ qui n'est pas traité ici.
- Ma STL provoque des fuites mémoires ! Est-ce normal ?
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 © 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.