Certaines questions d'entretien C++ que vous devez comprendre

php是最好的语言
Libérer: 2018-08-06 16:13:21
original
2696 Les gens l'ont consulté

L'essence des questions d'entretien C++

1., pourquoi peut-on Les constructeurs ne sont-ils pas déclarés comme fonctions virtuelles ?

Analyse : Parce que la fonction virtuelle utilise la méthode d'appel virtuel, l'appel virtuel fait référence au mécanisme de travail qui permet à

de connaître seulement une partie des informations , permet spécifiquement d'appeler une fonction qui ne connaît que l'interface mais pas le type exact de son objet.

Mais si on veut appeler le constructeur pour créer un objet, il faut connaître le type exact de l'objet,

Le constructeur ne peut donc pas être une fonction virtuelle.

2. Quelles fonctions en C++ ne peuvent pas être déclarées comme fonction virtuelle ?

Analyse : fonctions ordinaires (fonctions non membres), constructeurs, fonctions membres en ligne, fonctions membres statiques, fonctions amies.

(1) Les fonctions virtuelles sont utilisées pour les classes de base et les classes dérivées, les fonctions ordinaires ne peuvent pas être

(2) Les constructeurs ne peuvent pas être utilisés car les fonctions virtuelles utilisent des méthodes d'appel virtuelles,

(3) L'essence des fonctions membres en ligne est d'étendre directement le code au lieu d'appel

(4) Lors de l'héritage, les fonctions membres statiques ne peuvent pas être héritées, car elles n'appartiennent qu'à une seule classe. pas de liaison dynamique

(5) La fonction ami n'est pas une fonction membre de la classe, elle ne peut donc pas être héritée

3 .Quelle est la différence entre les membres statiques et les membres non statiques d'une classe ?

Réponse : Il n'y a qu'un seul membre statique d'une classe pour chaque classe. Les membres statiques sont partagés par les objets d'instance de toutes les classes. Les membres statiques incluent les variables de membre statique et les membres statiques. Fonctions.Les variables membres statiques doivent être initialisées avant utilisation.Les variables membres statiques sont accessibles par les fonctions membres statiques et les fonctions membres non statiques, tandis que les fonctions membres statiques ne peuvent accéder qu'aux variables membres statiques car les fonctions membres statiques appartiennent à des classes et n'en ont pas. pointeurs. Chaque objet possède un membre non statique.

4 Quelle est la différence entre la surcharge et la réécriture (surchargée, certains livres appellent aussi cela "écrasement") ?

Surcharge : fait référence à l'autorisation de plusieurs fonctions portant le même nom, mais les listes de paramètres de ces fonctions sont différentes (peut-être que le nombre de paramètres est différent, peut-être que les types de paramètres sont différents). différents, peut-être les deux différents). Réécriture : désigne la méthode par laquelle une sous-classe redéfinit une fonction virtuelle d'une classe complexe. Du principe d'implémentation : surcharge : le compilateur modifie les noms des fonctions du même nom en fonction de différentes listes de paramètres des fonctions, puis ces fonctions du même nom deviennent des fonctions différentes (au moins pour le compilateur). Par exemple, il existe deux fonctions portant le même nom : function func (p : integer) : entier ; et function func (p : string) : integer;. Alors les noms de fonctions modifiés par le compilateur peuvent ressembler à ceci : int_func, str_func. Les appels à ces deux fonctions ont été déterminés entre compilateurs et sont statiques. En d’autres termes, leurs adresses sont liées au moment de la compilation (liaison anticipée), donc la surcharge n’a rien à voir avec le polymorphisme ! Réécriture : Vraiment pertinent pour le polymorphisme. Lorsqu'une sous-classe redéfinit la fonction virtuelle de la classe parent, le pointeur de la classe parent appelle dynamiquement la fonction appartenant à la sous-classe en fonction des différents pointeurs de sous-classe qui lui sont attribués. De tels appels de fonction ne peuvent pas être déterminés lors de la compilation (appel L'adresse de la fonction virtuelle. de la sous-classe ne peut être donnée). Par conséquent, ces adresses de fonction sont liées au moment de l'exécution (liaison tardive)

5 Décrivez brièvement les différences entre les fonctions membres, les fonctions globales et les fonctions amies.

Les fonctions membres ne peuvent être appelées que par des objets instanciés par cette classe. [Sauf les membres statiques]

Les fonctions globales peuvent être appelées n'importe où.

Les fonctions amies peuvent être appelées par les objets de cette classe et les classes amies.

La mémoire allouée avec new est supprimée avec delete. La mémoire allouée avec new[] est supprimée avec delete[] appellera le destructeur de l'élément du tableau. Les types de données internes n'ont pas de destructeurs, ce n'est donc pas un gros problème. Si vous utilisez delete sans parenthèses, delete pensera qu'il pointe vers un seul objet, sinon il pensera qu'il pointe vers un tableau.

6. Avantages et inconvénients de l'héritage.

L'héritage de classe est défini statiquement au moment de la compilation et peut être utilisé directement. L'héritage de classe peut plus facilement modifier l'implémentation de la classe parent. Mais l’héritage de classe présente également quelques inconvénients. Premièrement, l’héritage étant défini au moment de la compilation, l’implémentation héritée de la classe parent ne peut pas être modifiée au moment de l’exécution. Pour aggraver les choses, la classe parent définit généralement au moins une partie du comportement de la classe enfant, et toute modification apportée à la classe parent peut affecter le comportement de la classe enfant. Si l’implémentation héritée n’est pas adaptée pour résoudre le nouveau problème, la classe parent doit être réécrite ou remplacée par une autre classe plus adaptée. Cette dépendance limite la flexibilité et finalement la réutilisabilité. (À ajouter)

7. Quelles sont les propriétés du C++ (fonctionnalités orientées objet)

Encapsulation , héritage et états multiples.

Dans les langages de programmation orientés objet, l'encapsulation est une fonctionnalité qui utilise des composants réutilisables pour construire des systèmes logiciels. Elle prend non seulement en charge la réutilisabilité du système, mais contribue également à améliorer l'évolutivité du système ; Envoyer un message commun tout en appelant différentes méthodes ; l'encapsulation est une technique permettant de masquer des informations, et son objectif est de séparer la définition et l'implémentation d'une classe.

8. Quand faut-il utiliser des « références constantes » ?

Si vous souhaitez utiliser des références pour améliorer l'efficacité du programme et protéger les données transmises à la fonction contre toute modification dans la fonction, vous devez utiliser des références constantes. Méthode de déclaration de référence constante : identifiant de type const et nom de référence = nom de la variable cible ;

int a

const int &ra=a; 🎜>

a=1; //Corriger

Exemple 2 string foo( );

void bar(string & s); la formule sera illégale :

bar(foo( ));

bar("hello world");

La raison est que foo( ) et "hello world"; string Un objet temporaire sera généré, et en C++, ces objets temporaires sont de type const. Par conséquent, l’expression ci-dessus tente de convertir un objet de type const en un type non const, ce qui est illégal. Les paramètres de référence doivent être définis comme const s'ils peuvent être définis comme const

9 À quoi sert ASSERT() ? >

Réponse : ASSERT() est une macro souvent utilisée lors du débogage d'un programme. Lorsque le programme est en cours d'exécution, il évalue l'expression entre parenthèses. Si l'expression est FALSE (0),

Programme An. une erreur sera signalée et l’exécution sera terminée. Si l'expression n'est pas 0, continuez à exécuter les instructions suivantes. Cette macro détermine généralement si des données manifestement illégales apparaissent dans le programme. Si tel est le cas, elle termine le programme pour éviter des conséquences graves et facilite également la recherche d'erreurs. Par exemple, la variable n ne doit pas être 0 dans le programme. Si elle est 0, cela peut provoquer une erreur 10.

Analyse : ① Une référence à une classe de base peut pointer vers une instance de sa classe dérivée

② Un pointeur vers une classe de base peut pointer vers une instance de sa classe dérivée

11.

Trois caractéristiques fondamentales de orienté objet et simple. Racontez-le ?

① Encapsulation : abstrait les éléments objectifs dans des classes, et chaque classe implémente le contrôle d'accès (privé, protégé, public) sur ses propres données et méthodes ② Héritage : Il existe trois formes d'implémentation d'héritage généralisé : Héritage d'implémentation (faisant référence à la possibilité d'utiliser les propriétés et les méthodes de la classe de base sans codage supplémentaire) Héritage visuel (les formulaires enfants utilisent Apparence du formulaire parent et code d'implémentation) Héritage de l'interface (seules les propriétés et les méthodes sont utilisées, l'implémentation est en retard par rapport à l'implémentation de la sous-classe). Les deux premiers (héritage de classe) et le dernier (combinaison d'objets => héritage d'interface et fonction virtuelle pure) constituent deux modes de réutilisation de fonctions.

③ Polymorphisme : C'est la technique qui consiste à rendre un objet parent égal à un ou plusieurs de ses objets enfants. Après affectation, l'objet parent peut fonctionner de différentes manières selon les caractéristiques des objets enfants qui lui sont actuellement attribués. . Pour faire simple, cela tient en une phrase : Il est permis d’attribuer un pointeur d’un type de sous-classe à un pointeur d’un type de classe parent.

Question complémentaire : Quel est le rôle du polymorphisme ?

Principalement deux :

1. Masquer les détails d'implémentation pour activer la modularisation du code ; étendre les modules de code pour réaliser la réutilisation du code ;

2. , assurez-vous que l'appel est correct lors de l'utilisation d'un attribut d'une instance de n'importe quelle classe de la famille.

12Surcharge et réécriture, certains livres sont aussi appelés "remplacement " ) ?

① Surcharge : cela signifie que plusieurs fonctions portant le même nom sont autorisées à exister, et les listes de paramètres de ces fonctions sont différentes (peut-être que le nombre de paramètres est différent, peut-être que les types de paramètres sont différents, ou les deux sont différents).

② Réécriture : fait référence à la méthode par laquelle une sous-classe redéfinit la fonction virtuelle de la classe parent.

En termes de principes d'implémentation :

① Surcharge : Le compilateur modifie les noms des fonctions du même nom en fonction de différentes listes de paramètres des fonctions, puis ces fonctions du même nom deviennent différentes fonctions (au moins pour le compilateur). L'appel à ce type de fonction est déterminé lors de la compilation et est statique. En d’autres termes, leurs adresses sont liées au moment de la compilation (liaison anticipée), donc la surcharge n’a rien à voir avec le polymorphisme !

② Réécriture : Vraiment liée au polymorphisme. Lorsqu'une sous-classe redéfinit la fonction virtuelle de la classe parent, le pointeur de la classe parent appelle dynamiquement la fonction appartenant à la sous-classe en fonction des différents pointeurs de sous-classe qui lui sont attribués. De tels appels de fonction ne peuvent pas être déterminés lors de la compilation (appel L'adresse de la fonction virtuelle. de la sous-classe ne peut être donnée). Par conséquent, une telle adresse de fonction est liée au moment de l'exécution (liaison tardive)

13Quel est le rôle du polymorphisme ?

Il y en a deux principaux :

① Masquer les détails d'implémentation afin que le code puisse être modularisé ;

② Réutilisation de l'interface : afin de garantir l'appel correct lors de l'utilisation d'un certain attribut d'une instance de n'importe quelle classe de la famille lorsque la classe hérite et dérive.

14, classe vide en C++, la fonction membre de classe générée par défaut :

class
{
  public:
    Empty();                         // 缺省构造函数
    Empty(const Empty&);             // 拷贝构造函数
    ~Empty();                        // 析构函数
    Empty& operator=(const Empty&);  // 赋值运算符
    Empty* operator&();              // 取值运算符
    const Empty* operator&() const;  // 取值运算符const
};
Copier après la connexion

15 Quelles sont les méthodes de communication inter-processus ?<🎜. >Les méthodes de communication inter-processus incluent : la mémoire partagée, les canaux (canaux nommés/canaux sans nom), les sockets, les files d'attente de messages, les signaux, les sémaphores, le mappage de la mémoire, etc.

16Quatre conditions nécessaires à une impasse ? Mutuellement exclusifs, demande de maintien, inaliénable, boucle.

17 Quelle est la différence entre les membres statiques et les membres non statiques d'une classe ? Il n'y a qu'un seul membre statique de chaque classe, qui appartient à cette classe ; chaque objet du membre non statique de la classe a une copie.

18

Qu'est-ce qu'une copie superficielle ? Qu'est-ce qu'une copie complète ?

Une copie superficielle signifie que l'objet source et l'objet copie partagent une entité, seules les variables référencées sont différentes (noms différents). Les modifications apportées à un objet affecteront l’autre objet.

La copie approfondie signifie que l'objet source et l'objet copié sont indépendants l'un de l'autre et que les modifications apportées à l'un des objets n'affecteront pas l'autre objet.

De manière générale, une copie superficielle consiste à copier le pointeur de cet objet. Une copie complète copie cet objet.

19, Fenêtres Plusieurs façons de synchroniser les threads de programmation ? (Important)

Verrouillage atomique, section critique (segment), événement, mutex (corps), sémaphore, minuterie waitable

20 Qu'est-ce qu'une « citation » ? À quels problèmes devons-nous prêter attention lors de la déclaration et de l'utilisation de la « référence » ?

Réponse : Une référence est un "alias" (alias) d'une variable cible. L'effet de l'exploitation d'une référence est exactement le même que celui de l'exploitation directe d'une variable. Lors de la déclaration d'une référence, pensez à l'initialiser. Une fois la référence déclarée, elle équivaut à un nom de variable cible ayant deux noms, à savoir le nom d'origine de la cible et le nom de référence. Le nom de référence ne peut plus être utilisé comme alias pour d'autres noms de variable. Déclarer une référence ne définit pas une nouvelle variable. Cela signifie seulement que le nom de la référence est un alias du nom de la variable cible. Ce n'est pas un type de données en soi, donc la référence elle-même n'occupe pas d'unité de stockage, et le système le fait. ne pas attribuer d'unités de stockage à la référence. Impossible de créer une référence au tableau.

21 Quelle est la différence entre une "référence" et un pointeur ?

Une fois qu'un pointeur pointe vers un objet via une variable de pointeur, il opère indirectement sur la variable vers laquelle il pointe. L'utilisation de pointeurs dans le programme rend le programme moins lisible ; la référence elle-même est un alias de la variable cible et l'opération sur la référence est l'opération sur la variable cible. De plus, il y a la différence entre passer une référence et un pointeur vers les fonctions mentionnées ci-dessus.

22 Quelle est la différence entre l'association, l'agrégation (Agrégation) et la composition (Composition. ) ?

Implique certains concepts en UML : l'association représente une connexion générale entre deux classes, comme « étudiant » et « enseignant » est une relation d'association représente le has-a ; La relation est une relation relativement lâche.La classe agrégée n'a pas besoin d'être responsable de la classe agrégée.Comme le montre la figure ci-dessous, un losange vide est utilisé pour représenter la relation d'agrégation :

Du point de vue de l'implémentation, agrégation Cela peut être exprimé comme suit :

class A {...} class B { A* a .....}

Et la combinaison représente la relation contient-a, et la corrélation est plus forte que l'agrégation : La classe combinante et la classe combinée ont le même cycle de vie. La classe combinante est responsable de la classe combinée. Un losange solide est utilisé pour représenter la relation de combinaison :

Le formulaire d'implémentation. est :

classe A{ ...} classe B{ A a ...}

23 Orienté Trois caractéristiques fondamentales des objets et les décrire brièvement ?

1. Encapsulation : abstrait les éléments objectifs dans des classes, et chaque classe implémente une protection (privée, protégée, publique) pour ses propres données et méthodes

2. . Héritage : il existe trois formes d'implémentation d'héritage généralisé : l'héritage d'implémentation (faisant référence à la possibilité d'utiliser les propriétés et les méthodes de la classe de base sans codage supplémentaire), l'héritage visuel (le formulaire enfant utilise l'apparence et le code d'implémentation du formulaire parent. ) et l'héritage de l'interface (seules les propriétés et les méthodes sont utilisées, l'implémentation est en retard par rapport à l'implémentation de la sous-classe). Les deux premiers (héritage de classe) et le dernier (combinaison d'objets => héritage d'interface et fonction virtuelle pure) constituent deux modes de réutilisation de fonctions.

3. Polymorphisme : Il s'agit d'une technique consistant à définir un objet parent pour qu'il soit égal à un ou plusieurs de ses objets enfants. Après affectation, l'objet parent peut être configuré différemment en fonction des caractéristiques des objets enfants actuellement. mode de fonctionnement qui lui est assigné. Pour faire simple, cela tient en une phrase : Il est permis d’attribuer un pointeur d’un type de sous-classe à un pointeur d’un type de classe parent.

24 Quel est le rôle du polymorphisme ?

Il y en a deux principaux : 1. Masquer les détails d'implémentation afin que le code puisse être modularisé ; étendre les modules de code pour réaliser la réutilisation du code ; 2. Réutilisation de l'interface : pour les classes ; utiliser l'héritage et lors de la dérivation, garantir l'appel correct lors de l'utilisation d'un attribut d'une instance de n'importe quelle classe de la famille.

25 Pourquoi devez-vous appeler une fonction compilée par un compilateur C dans un C++ programme ? Ajouter une instruction externe « C » ?

///extern est un mot-clé en langage C/C++ qui indique la portée des fonctions et des variables globales. Ce mot-clé indique au compilateur que les fonctions et variables qu'il déclare peuvent être utilisées dans ce module ou dans d'autres modules

<. 🎜 >// extern "C est une déclaration de connexion. Lors de la compilation, elle indique au compilateur que le code suivant doit être compilé et connecté à la manière du C. Le but est de réaliser une programmation mixte de C++, C et d'autres langages.

26 Quelle est la différence entre "référence" et pointeur ? Une fois qu'un pointeur pointe vers un objet via une variable de pointeur, il opère indirectement sur la variable vers laquelle il pointe. L'utilisation de pointeurs dans les programmes rend le programme moins lisible ; La référence elle-même est la variable cible.Alias, l'opération sur la référence est l'opération sur la variable cible. De plus, c'est la différence entre passer la référence et le pointeur vers la fonction mentionnée ci-dessus. delete et malloc free ?

Réponse : les deux effectuent des opérations de mémoire dynamique sur le tas. La fonction malloc doit spécifier le nombre d'octets d'allocation de mémoire. et ne peut pas initialiser l'objet. new appellera automatiquement le constructeur de l'objet. delete appellera le destructeur de l'objet, tandis que free n'appellera pas le destructeur de l'objet.24

Caractéristiques des fonctions membres surchargées :

(1) Même portée (Dans la même classe) ; Le nom de la fonction est le même ; (3) Les paramètres sont différents (4) Le mot-clé virtuel est facultatif 25<. 🎜>L'écrasement signifie que les fonctions de classe dérivée couvrent les fonctions de classe de base. Les caractéristiques sont :


(1) Différentes portées (situées respectivement dans les classes dérivées et les classes de base) ; > (2) Les noms de fonction sont les mêmes ;
(3) Les paramètres sont les mêmes ;

(4) La fonction de classe de base doit avoir le mot-clé virtuel

<🎜. >26Si vous utilisez VC pour développer un programme, il existe plusieurs erreurs courantes, C2001, c2005, c2011, quelles en sont les causes erreurs ?

Dans le processus d'apprentissage de VC++, les messages d'erreur des erreurs LNK2001 rencontrés sont principalement :

symbole externe non résolu "symbole" (externe non défini " symbole").

Ce message d'erreur sera généré si l'éditeur de liens ne parvient pas à trouver la fonction, la variable ou l'étiquette référencée dans toutes les bibliothèques et fichiers objets. De manière générale, il existe deux raisons d'erreurs : premièrement, la fonction ou la variable référencée n'existe pas, est mal orthographiée ou est mal utilisée deuxièmement, une version différente de la connexion ; peut être utilisé comme bibliothèque. Nous rencontrons souvent des erreurs LNK2005 en programmation - des erreurs de définition répétées. En fait, les erreurs LNK2005 ne sont pas difficiles à résoudre

. 27

Présentez STL et expliquez en détail comment STL implémente le vecteur.

STL (Standard Template Library) est composée d'itérateurs d'algorithmes de conteneur.

STL présente les avantages suivants : Il peut facilement implémenter une série d'algorithmes tels que la recherche de données ou le tri de données Il est plus sûr et plus pratique de déboguer des programmes ; Vous pouvez facilement comprendre même le code écrit par des personnes utilisant STL sous la plateforme UNIX (car STL est multiplateforme). Vector est essentiellement un tableau dynamique, qui augmentera dynamiquement l'espace du tableau en fonction de l'augmentation des données. 28

Présentez les modèles et les conteneurs. Comment y parvenir ? (Peut-être que je vais vous donner un exemple pour l'implémenter sur place)

On peut dire que les modèles sont relativement anciens, mais la programmation générique actuelle est essentiellement une programmation de modèles.

Il incarne une idée universelle et généralisée.

STL dispose de 7 conteneurs principaux : vecteur, liste, deque, carte, multimap, set, multiset.

29  : Décrire brièvement le principe de l'implémentation polymorphe

Générer une table de fonctions virtuellesvtable pour cette classe. Chaque entrée dans la table des fonctions virtuelles est un pointeur vers la fonction virtuelle correspondante. Le compilateur insère aussi implicitement un pointeur vptr dans cette classe (pour le compilateur vc, il l'insère dans la classe ) pointe vers la table des fonctions virtuelles. Lors de l'appel du constructeur de cette classe, le compilateur effectuera implicitement l'association entre vptr et vtable Code, point vptr à la vtable correspondante, et connectez la classe à la vtable de cette classe. De plus, lorsque le constructeur de la classe est appelé, le pointeur vers la classe de base est désormais devenu le this pointeur vers la classe spécifique, s'appuyant ainsi sur ce ce pointeur peut obtenir la vtable correcte. Ce n'est qu'ainsi que nous pourrons véritablement nous connecter au corps fonctionnel. C'est la liaison dynamique et le principe de base de la réalisation du polymorphisme.

30 : Parlez de votre compréhension de l'orientation objet

Analyse : L'orientation objet peut être comprise comme le traitement de chaque problème en déterminant d'abord que le problème se compose de plusieurs parties et que chaque partie est en fait un objet. Concevez ensuite ces objets séparément et obtenez enfin l'intégralité du programme. La programmation traditionnelle est principalement considérée et conçue sur la base d'idées fonctionnelles, tandis que la programmation orientée objet considère les problèmes en fonction du point de vue de l'objet. Cela peut rendre le programme plus concis et plus clair.

Explication : Les plus exposés en programmation"Technologie de programmation orientée objet" c'est juste que cela fait partie intégrante de la technologie orientée objet. Tirer parti de la technologie orientée objet est un problème technique complet qui nécessite non seulement une technologie d'analyse, de conception et de programmation orientée objet, mais nécessite également l'aide des outils de modélisation et de développement nécessaires.

31 Pourquoi utiliser des classes de modèles en C++.

Analyse :

1) Peut être utilisé pour créer des structures de données croissantes et décroissantes de manière dynamique

2) Il est indépendant du type, Il est donc hautement réutilisable.

3) Il vérifie les types de données au moment de la compilation plutôt qu'à l'exécution, garantissant la sécurité des types

4) Il est indépendant de la plate-forme et portable

5) Peut être utilisé avec des types de données de base

32 Quelle est la différence entre les modèles de fonction et les modèles de classe ?

Réponse : L'instanciation des modèles de fonctions est automatiquement complétée par le compilateur lors du traitement des appels de fonction, tandis que l'instanciation des modèles de classe

doit être spécifié explicitement par le programmeur dans le programme.

33. Quelles sont les principales étapes pour réaliser une connexion winsock ? (Très important, il faut demander)

Réponse : Côté serveur : socker()Établir un socket, lier (bind) et écouter (écouter), utilisez accepter()

En attente de connexion client.

Client : socker()Établir le socket, connecter (connecter ) le serveur, après vous être connecté, utilisez send() et recv (

) , écrivez et lire les données sur le socket jusqu'à ce que l'échange de données soit terminé, closesocket() fermez le socket.

Côté serveur : accepter() trouve une connexion client, établit un nouveau socket et recommence à attendre la connexion

Accepter. Le socket nouvellement généré utilise send() et recv() pour écrire et lire des données jusqu'à ce que l'échange de données soit terminé, closesock

et()Fermez la prise.

34 La différence entre les processus et les threads.

Réponse : Un thread fait référence à une unité d'exécution au sein d'un processus et est également une entité planifiable au sein d'un processus :

( 1) Planification : les threads sont l'unité de base de la planification et de l'allocation, et les processus sont les unités de base de la propriété des ressources

(2) Concurrence : non seulement les processus peuvent être exécutés simultanément, mais plusieurs threads du même processus peuvent également être exécuté simultanément.

(3) Ressources propres : un processus est une unité indépendante qui possède des ressources. Les threads ne possèdent pas de ressources système, mais ils peuvent accéder aux ressources appartenant au processus. (4) Surcharge du système : lors de la création ou de l'annulation d'un processus, étant donné que le système doit allouer et récupérer des ressources pour celui-ci, la surcharge du système est nettement supérieure à la surcharge lors de la création ou de l'annulation de threads.

35. Le type C++ est-il sûr ?

Réponse : Non. Vous pouvez diffuser entre deux pointeurs de types différents (utilisez

cast réinterpréter) . C# est de type sécurisé.

  1. Si vous utilisez VC pour développer un programme, il existe plusieurs erreurs courantes, C2001, c2005, c2011, quelles en sont les raisons ces erreurs.

37 La différence entre les macros et les fonctions en ligne Analyse : les fonctions en ligne et les macros sont développées là où le programme apparaît. Les fonctions en ligne ne sont pas implémentées via des appels de fonction, mais sont développées au niveau du programme qui appelle la fonction (les macros sont également complétées );

< ; 🎜>La différence est que les fonctions en ligne peuvent compléter des fonctions de compilation telles que la détection de type et si les instructions sont correctes lors de la compilation ; les macros n'ont pas de telles fonctions et le temps d'expansion des macros est différent de celui des fonctions en ligne (Développer pendant l'exécution) <. 🎜>

38 Où est le point d'entrée du programme Windows de boucle de messages dans win32 ? Écrivez le processus du mécanisme de message Windows

Analyse : Le point d'entrée du programme Windows est la fonction WinMain(). Mécanisme de traitement des messages de l'application Windows :

A. Le système d'exploitation reçoit le message de la fenêtre de l'application et transmet le message à la file d'attente des messages de l'application

B. appelle la fonction GetMessage dans la boucle de messages pour récupérer les messages un par un dans la file d'attente des messages. Après avoir récupéré les messages, l'application peut effectuer un prétraitement sur les messages.

C. L'application appelle DispatchMessage pour renvoyer le message au système d'exploitation.

D. Le système utilise le pointeur vers la fonction de procédure de fenêtre enregistrée dans le membre lpfnWndProc de la structure WNDCLASS pour appeler la procédure de fenêtre afin de traiter le message.

39 : Parlez de votre compréhension ou de votre connaissance des spécifications de programmation

Les spécifications de programmation peuvent être résumées comme suit : Faisabilité du programme , lisibilité, portabilité et testabilité.

Remarque : Il s'agit des grandes lignes des spécifications de programmation. Les enquêteurs n'ont pas besoin de réciter les exemples donnés ci-dessus. Ils doivent comprendre les problèmes illustrés par ces exemples et réfléchir à la manière dont ils peuvent résoudre la faisabilité et les questions de lisibilité et de portabilité. et la testabilité sont combinées avec les exemples ci-dessus et vos habitudes de programmation habituelles pour répondre à cette question.

40 Pourquoi les surcharges d'opérateurs de flux renvoient-elles des références ;Remarque : à l'exception des opérateurs d'affectation et des opérateurs de flux, les autres opérateurs tels que +, -, *, /, etc. ne doivent pas renvoyer de références. Étant donné que les objets de ces quatre opérateurs sont tous des rvalues, ils doivent construire un objet comme valeur de retour.

41 Est-il vrai qu'une classe parent écrit une fonction virtuelle ? Si la sous-classe remplace sa fonction sans ajouter de virtuel, le polymorphisme peut-il être obtenu ?

vle modificateur virtuel sera hérité implicitement. private est également intégré, mais les classes dérivées n'ont aucun droit d'accès. Le virtuel peut être ajouté ou non. L'espace de la sous-classe contient toutes les variables de la classe parent (sauf statiques). Il n'y a qu'une seule entité pour la même fonction (sauf en ligne). Les sous-classes peuvent également réaliser le polymorphisme en remplaçant leurs fonctions sans ajouter de virtuel. Dans l'espace de la sous-classe, se trouvent les variables privées de la classe parent. Les variables privées ne sont pas accessibles directement.

42. Quelle est la différence entre C et C++ ?

Mécaniquement : c est orienté processus (mais C peut également écrire des programmes orientés objet) ; C++ est orienté objet et fournit des classes. Cependant, il est plus facile d'écrire des programmes orientés objet en C++ qu'en C Dans la direction applicable : c convient aux occasions qui nécessitent une petite taille de code et une efficacité élevée, comme le c++ intégré convient aux applications supérieures ; programmes de niveau supérieur et complexes ; noyau Linux La plupart d'entre eux sont écrits en C, car il s'agit d'un logiciel système et a des exigences d'efficacité extrêmement élevées.

On peut également voir d'après le nom que c++ a plus de + que c, ce qui signifie que c++ est un sur-ensemble de c ; alors pourquoi est-il appelé c++ au lieu de c+ ? c Il y avait trop de choses à développer, alors j'ai mis deux + après c; donc c'est devenu c++

Le langage C est un langage de programmation structuré, et C++ est un langage de programmation orienté objet.

C++ se concentre sur les objets plutôt que sur les processus, et sur la conception de classes plutôt que sur la conception logique.

43 Quel est le but de l'indicateur #error du préprocesseur ?

Si vous ne connaissez pas la réponse, veuillez consulter la référence 1. Cette question est utile pour distinguer un homme normal d’un nerd. Seul un nerd lirait l’annexe d’un manuel de langage C pour trouver la réponse à une question comme celle-ci. Bien sûr, si vous ne cherchez pas un nerd, le candidat a intérêt à espérer ne pas connaître la réponse.
44. Veuillez décrire brièvement les avantages et les inconvénients des deux boucles for suivantes
// D'abord

pour (i=0; i++;){if (condition)DoSomething();else DoOtherthing();}/ / Deuxième
if (condition){for (i=0; i++;)DoSomething();}
else{for (i=0; i++ ;) DoOtherthing();}
Remplissez les espaces vides et les questions à choix multiples :

1.

Lequel des opérateurs suivants ne peut pas être surchargé ?

( )A. Opérateur de portée « :: »

B. Opérateur membre d'objet « . »C . "->"D. Opérateur ternaire "? :"Analyse : Il n'y a aucune raison, même ABD ne fonctionnera pas

2.

Dans la description suivante des classes C++, la mauvaise est

A. Les classes introduites dans le langage C++ remplissent principalement deux fonctions, comme le mécanisme d'encapsulation des données et la définition de type. mécanisme

B. Les données et fonctions définies dans une classe C++ sont appelées respectivement données membres et fonctions membres

En tant que mécanisme d'encapsulation de données, la classe C.C++ organise les données et les opérations sur les données pour masquer les informations

Les membres de la classe D.C++ peuvent être divisés en quatre types : membres publics, Protect membres, membres privés et amis

Bonne réponse : D

3 . En supposant que int x = 123, l'instruction peut produire une sortie sous la forme de "+123" ("" représente un espace).

A.cout << cout << setw (8) << showpos << interne << ; showpos << gauche << x <<

D.cout << interne << 🎜>

4

Dans l'instruction de déclaration du modèle de classe, la bonne est . A.template classe Échantillon {…}; B.template classe Échantillon {…} ; C.template classe Exemple {…};

D.template Exemple {…};

Réponse correcte : C

5

Types A et B intégrés non C++, dans quelles situations B peut-il être implicitement converti en A ? [C++ Medium] a. classe B : public A { ……}b. classe B { opérateur A( >c. ( const B& ); }d. A& Operator= ( const A& ); Analyse : le premier élément, B, est hérité publiquement de A et peut être hérité indirectement. Le deuxième élément : B implémente la conversion implicite en A

Le troisième élément : A implémente le constructeur du paramètre non explicite B (peut avoir d'autres paramètres avec des valeurs par défaut)
Quatre éléments : Opération d'affectation, bien qu'elle n'est pas une authentique conversion de type implicite, elle peut toujours être considérée comme une

6


Le la fausse déclaration à propos de ce pointeur est (A)

    Ce pointeur doit afficher le description
    1. Lorsqu'un objet est créé, le pointeur this pointe vers l'objet
    2. La fonction membre a ce pointeur Posséder ce pointeur
    3. 7.
    4. Dans la déclaration du prototype de fonction ci-dessous, (B) déclare fun comme une fonction virtuelle pure

A . void fun()=0; 🎜>

B virtuel void fun()=0 >8<🎜; >L'opérateur ami obj>obj2 est interprété comme (A) par le compilateur C++.

opérateur>(obj1,obj2)

>(obj1,obj2)

obj2. opérateur>(obj1)
    1. obj1.oprator>(obj2)

9.假定AB为一个类,则执行“AB a(4),b[3],*p[2];”语句时,自动调用该类构造函数的次数为:B

A) 3 B) 4 C) 6 D) 9

10.假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为:B

A) AB operator+(AB &a,AB &b)

B) AB operator+(AB &a)

C) operator+(AB a)

D) AB & operator+()

11.有二维字符数组char s[4][6]={"zhang","gao","tang","wang"};执行程序cout<<*s[2],屏幕上显示:D

A)gao B)tang C)g D)t

12 #include打印结果是多少

 using namespace std;
   class A1{
   public:
    int a;
    static int b;
    A1();
    ~A1();
   };
   int main()   {
    cout << sizeof(A1) <<endl;
   }
Copier après la connexion

         解析:是4, 静态变量是存放在全局数据区的, 而sizeof是计算局部栈中分配的大小。

13.死锁的处理

  解析:鸵鸟策略、预防策略、避免策略、检测与解除死锁,只要知道概念就行,不需要掌握

14. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]

解析:a. class B : public A { ……} // B公有继承自A,可以是间接继承的

     b. class B { operator A( ); } // B实现了隐式转化为A的转化

    c. class A { A( const B& ); } // A实现non-explicit的参数为B(可有其他带默认值的参数)构造函数

    d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

15以下代码有什么问题?[STL易]

typedef vector IntArray;

IntArray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

    if( 2 == *itor ) array.erase( itor );

}

    解析:其实里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

16 下列代码的输出值是多少?

class A{};

class A1{};

class B : public A{};

class C : public A, public A1{};

class D : public virtual A{};

cout << sizeof ( A ) << endl;

cout << sizeof ( B ) << endl;

cout << sizeof ( C ) << endl;

cout << sizeof ( D ) << , 1, 1, 4 expliquent : l'espace occupé par la classe vide est 1, l'espace de classe vide de l'héritage unique est également 1, et l'espace de classe vide de l'héritage multiple est toujours 1, mais l'héritage virtuel implique des tables virtuelles (pointeurs virtuels ), donc la taille est 4.

Articles connexes :


Partage de 125 questions et réponses d'entretien de base en C#

Première question d'entretien, question d'entretien

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal