top 70 c interview questions
Questions d'entrevue C ++ de base et avancées les plus fréquemment posées avec des exemples de code pour les candidats débutants ainsi que pour les professionnels expérimentés:
Cet article détaillé sera sûrement un signet pour ceux qui se préparent à un entretien C ++.
Presque tous les principaux sujets en C ++ sont traités ici avec quelques questions de base sur des sujets avancés tels que la bibliothèque de modèles standard (STL), etc.
Cet ensemble de questions de codage C ++ vous aidera à faire face à toute interview C ++ avec confiance et à l'effacer avec succès dès la première tentative.
Ce que vous apprendrez:
- Questions d'entrevue C ++ avec des exemples de code
Questions d'entrevue C ++ avec des exemples de code
Vous trouverez ci-dessous les questions d'entretien de programmation C ++ les plus populaires auxquelles un expert C ++ répond.
Lire aussi => Questions d'entretien les plus fréquentes sur la programmation C
C ++ de base
Structure du programme C ++
Q # 1) Quelle est la structure de base d'un programme C ++?
Répondre: La structure de base d'un programme C ++ est illustrée ci-dessous:
#include int main() { cout<<”Hello,World!”; return 0; }
La première ligne qui commence par ' # ' est un directive du préprocesseur . Dans ce cas, nous utilisons comprendre comme une directive qui dit au compilateur d'inclure un en-tête tandis que ' iostream.h ”Qui sera utilisé pour l'entrée / sortie de base plus tard dans le programme.
La ligne suivante est la fonction «principale» qui renvoie un entier. La fonction principale est le point de départ de l'exécution de tout programme C ++. Quelle que soit sa position dans le fichier de code source, le contenu de la fonction main est toujours exécuté en premier par le compilateur C ++.
Dans la ligne suivante, nous pouvons voir des accolades ouvertes qui indiquent le début d'un bloc de code. Après cela, nous voyons l'instruction de programmation ou la ligne de code qui utilise le compte qui est le flux de sortie standard (sa définition est présente dans iostream.h).
Ce flux de sortie prend une chaîne de caractères et l'imprime sur un périphérique de sortie standard. Dans ce cas, c'est 'Hello, World!'. Veuillez noter que chaque instruction C ++ se termine par un point-virgule (;), ce qui est très nécessaire et son omission entraînera des erreurs de compilation.
Avant de fermer les accolades}, nous voyons une autre ligne «return 0;». C'est le point de retour vers la fonction principale.
Chaque programme C ++ aura une structure de base comme indiqué ci-dessus avec une directive de préprocesseur, une déclaration de fonction principale suivie d'un bloc de code et ensuite un point de retour vers la fonction principale qui indique l'exécution réussie du programme.
Q # 2) Quels sont les commentaires en C ++?
Répondre: Les commentaires en C ++ sont simplement un morceau de code source ignoré par le compilateur. Ils ne sont utiles qu'un programmeur pour ajouter une description ou des informations supplémentaires sur son code source.
En C ++, il existe deux façons d'ajouter des commentaires:
- // commentaire sur une seule ligne
- / * commentaire de bloc * /
Le premier type supprimera tout après que le compilateur rencontre «//». Dans le second type, le compilateur supprime tout ce qui se trouve entre «/ *» et «* /».
Variables, types de données et constantes
Q # 3) Différence entre déclaration et définition d'une variable.
Répondre: La déclaration d'une variable spécifie simplement le type de données d'une variable et le nom de la variable. À la suite de la déclaration, nous demandons au compilateur de réserver l'espace pour une variable dans la mémoire en fonction du type de données spécifié.
Exemple:
int Result; char c; int a,b,c;
Tous les éléments ci-dessus sont des déclarations valides. Notez également qu'à la suite de la déclaration, la valeur de la variable est indéterminée.
Alors qu'une définition est une implémentation / instanciation de la variable déclarée où nous lions la valeur appropriée à la variable déclarée afin que l'éditeur de liens puisse lier des références aux entités appropriées.
Exemple ci-dessus ,
Résultat = 10;
C = «A»;
Ce sont des définitions valides.
Q # 4) Commentez la portée locale et globale d'une variable.
Répondre: La portée d'une variable est définie comme l'étendue du code de programme dans lequel la variable reste active, c'est-à-dire qu'elle peut être déclarée, définie ou utilisée.
Il existe deux types de portée en C ++:
- Portée locale: On dit qu'une variable a une portée locale ou est locale lorsqu'elle est déclarée à l'intérieur d'un bloc de code. La variable reste active uniquement à l'intérieur du bloc et n'est pas accessible en dehors du bloc de code.
- Portée mondiale: Une variable a une portée globale lorsqu'elle est accessible dans tout le programme. Une variable globale est déclarée au-dessus du programme avant toutes les définitions de fonction.
Exemple:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q # 5) Quelle est la priorité quand il y a une variable globale et une variable locale dans le programme avec le même nom?
Répondre: Chaque fois qu'il existe une variable locale avec le même nom que celui d'une variable globale, le compilateur donne la priorité à la variable locale.
Exemple:
#include int globalVar = 2; int main() { int globalVar = 5; cout<La sortie du code ci-dessus est 5. C'est parce que, bien que les deux variables aient le même nom, le compilateur a donné la préférence à la portée locale.
Q # 6) Quand il y a une variable globale et une variable locale avec le même nom, comment allez-vous accéder à la variable globale?
Répondre: Quand il y a deux variables avec le même nom mais avec une portée différente, c'est-à-dire que l'une est une variable locale et l'autre est une variable globale, le compilateur donnera la préférence à une variable locale.
Pour accéder à la variable globale, nous utilisons un ' opérateur de résolution de portée (: :) ». En utilisant cet opérateur, nous pouvons accéder à la valeur de la variable globale.
Exemple:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Production:
Variable globale x = 10
Variable locale x = 2
Q # 7) Combien de façons existe-t-il pour initialiser un int avec une constante?
Répondre: Il y a deux manières:
- Le premier format utilise la notation C traditionnelle.
résultat int = 10; - Le second format utilise la notation constructeur.
résultat int (10);
Constantes
Q # 8) Qu'est-ce qu'une constante? Expliquez avec un exemple.
Répondre: Une constante est une expression qui a une valeur fixe. Ils peuvent être divisés en constantes entières, décimales, à virgule flottante, caractères ou chaînes en fonction de leur type de données.
Outre la décimale, C ++ prend également en charge deux autres constantes, à savoir les constantes octales (à la base 8) et hexadécimales (à la base 16).
Exemples de constantes:
- 75 // entier (décimal)
- 0113 // octal
- 0x4b // hexadécimal
- 3.142 // virgule flottante
- «C» // constante de caractère
- 'Hello, World' // constante de chaîne
Noter: Lorsque nous devons représenter un seul caractère, nous utilisons des guillemets simples et lorsque nous voulons définir une constante avec plus d'un caractère, nous utilisons des guillemets doubles.
Q # 9) Comment définissez-vous / déclarez-vous des constantes en C ++?
Répondre: En C ++, nous pouvons définir nos propres constantes en utilisant le #définir directive du préprocesseur.
#define Valeur de l'identifiant
Exemple:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Production: Aire d'un cercle = 78,55
Comme le montre l'exemple ci-dessus, une fois que nous avons défini une constante à l'aide de la directive #define, nous pouvons l'utiliser dans tout le programme et substituer sa valeur.
Nous pouvons déclarer des constantes en C ++ en utilisant le ' const ' mot-clé. Cette méthode est similaire à celle de la déclaration d'une variable, mais avec un préfixe const.
Exemples de déclaration d'une constante
const int pi = 3,142;
const char c = 'sth';
code postal const = 411014;
Dans les exemples ci-dessus, chaque fois que le type d'une constante n'est pas spécifié, le compilateur C ++ lui attribue par défaut un type entier.
Les opérateurs
Q # 10) Commentaire sur l'opérateur d'affectation en C ++.
Répondre: L'opérateur d'affectation en C ++ est utilisé pour affecter une valeur à une autre variable.
a = 5;
Cette ligne de code attribue la valeur entière 5 à variable à .
La partie à gauche de l'opérateur = est appelée lvaleur (valeur de gauche) et la droite comme rvaleur (bonne valeur). L évaluer doit toujours être une variable alors que le côté droit peut être une constante, une variable, le résultat d'une opération ou toute combinaison de celles-ci.
L'opération d'affectation se déroule toujours de droite à gauche et jamais à l'inverse.
Une propriété du C ++ par rapport aux autres langages de programmation est que l'opérateur d'affectation peut être utilisé comme rvaleur (ou partie d'un rvaleur ) pour une autre mission.
Exemple:
a = 2 + (b = 5);
est équivalent à:
b = 5;
a = 2 + b;
Ce qui signifie, attribuez d'abord 5 à variable b puis attribuer à à, la valeur deux plus le résultat de l'expression précédente de b (soit 5), laisse à avec une valeur finale de 7 .
Ainsi, l'expression suivante est également valide en C ++:
a = b = c = 5;
attribuer 5 aux variables à , b et c .
Q # 11) Quelle est la différence entre égal à (==) et opérateur d'affectation (=)?
Répondre: En C ++, égal à (==) et opérateur d'affectation (=) sont deux opérateurs complètement différents.
Equal to (==) est un opérateur relationnel d'égalité qui évalue deux expressions pour voir si elles sont égales et renvoie true si elles sont égales et false si elles ne le sont pas.
L'opérateur d'affectation (=) est utilisé pour affecter une valeur à une variable. Par conséquent, nous pouvons avoir une opération d'affectation complexe à l'intérieur de l'opérateur relationnel d'égalité pour l'évaluation.
Q # 12) Quels sont les différents opérateurs arithmétiques en C ++?
Réponse: C ++ prend en charge les opérateurs arithmétiques suivants:
- + ajout
- - soustraction
- * multiplication
- / division
- % module
Voyons les différents opérateurs arithmétiques avec le morceau de code suivant.
Exemple:
#include int main () { int a=5, b=3; cout<<”a + b = “< Production :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Comme indiqué ci-dessus, toutes les autres opérations sont simples et identiques aux opérations arithmétiques réelles, à l'exception de l'opérateur modulo qui est assez différent. L'opérateur Modulo divise a et b et le résultat de l'opération est le reste de la division.
Q # 13) Quels sont les différents opérateurs d'affectation de composés en C ++?
Répondre: Voici les opérateurs d'assignation composés en C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
L'opérateur d'assignation composé est l'une des fonctionnalités les plus importantes du langage C ++ qui nous permet de changer la valeur d'une variable avec l'un des opérateurs de base:
Exemple:
value += increase; is equivalent to value = value + increase; if base_salary is a variable of type int. int base_salary = 1000; base_salary += 1000; #base_salary = base_salary + 1000 base_salary *= 5; #base_salary = base_salary * 5;
Q # 14) Énoncez la différence entre les opérations pré et post incrémentation / décrémentation.
Répondre: C ++ autorise deux opérateurs à savoir ++ (incrémenter) et - (décrémenter), qui vous permettent d'ajouter 1 à la valeur existante d'une variable et de soustraire 1 de la variable respectivement. Ces opérateurs sont à leur tour appelés incrémentation (++) et décrémentation (-).
Exemple:
a = 5;
a ++;
La deuxième instruction, a ++, entraînera l'ajout de 1 à la valeur de a. Ainsi a ++ équivaut à
a = a + 1; ou
a + = 1;
Une caractéristique unique de ces opérateurs est que nous pouvons préfixer ou suffixer ces opérateurs avec la variable. Par conséquent, si a est une variable et que nous préfixons l'opérateur d'incrémentation, ce sera
++ a;
C'est ce qu'on appelle le pré-incrément. De même, nous avons également le pré-décrément.
Si nous préfixons la variable a avec un opérateur d'incrémentation, nous aurons,
a ++;
C'est le post-incrément. De même, nous avons également la post-décrémentation.
La différence entre la signification de pré et post dépend de la façon dont l'expression est évaluée et le résultat est stocké.
Dans le cas de l'opérateur de pré-incrémentation / décrémentation, l'opération d'incrémentation / décrémentation est exécutée en premier, puis le résultat est passé à une valeur l. Alors que pour les opérations de post-incrémentation / décrémentation, la valeur l est d'abord évaluée, puis l'incrémentation / décrémentation est effectuée en conséquence.
Exemple:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-une; # a = 5
b ++; # 6
E / S via la console
Q # 15) Quels sont les opérateurs d'extraction et d'insertion en C ++? Expliquez avec des exemples.
Répondre: Dans la bibliothèque iostream.h de C ++, Chine , et cout sont les deux flux de données utilisés respectivement pour l'entrée et la sortie. Cout est normalement dirigé vers l'écran et cin est affecté au clavier.
«Cin» (opérateur d'extraction): En utilisant l'opérateur surchargé >> avec le flux cin, C ++ gère l'entrée standard.
int age; cin>>age;
Comme indiqué dans l'exemple ci-dessus, une variable entière «age» est déclarée, puis elle attend que cin (clavier) entre les données. «Cin» traite l'entrée uniquement lorsque la touche RETURN est enfoncée.
'Cout' (opérateur d'insertion): Ceci est utilisé en conjonction avec la surcharge<< operator. It directs the data that followed it into the cout stream.
Exemple:
quel est le meilleur programme de suppression de logiciels malveillants
cout<<”Hello, World!”; cout<<123;
Structures et fonctions de contrôle
Contrôle des structures et des boucles
Q # 16) Quelle est la différence entre while et do while loop? Expliquez avec des exemples.
Répondre: Le format de la boucle while en C ++ est:
Alors que (expression)
{déclarations;}
Le bloc d'instructions sous while est exécuté tant que la condition de l'expression donnée est vraie.
Exemple:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<Dans le code ci-dessus, la boucle se terminera directement si n est égal à 0. Ainsi, dans la boucle while, la condition de fin est au début de la boucle et si elle est remplie, aucune itération de la boucle n'est exécutée.
Ensuite, nous considérons la boucle do-while.
Le format général de do-while est:
do {instruction;} while (condition);
Exemple:
#include int main() { int n; cout<>n; do { cout<Dans le code ci-dessus, nous pouvons voir que l'instruction à l'intérieur de la boucle est exécutée au moins une fois car la condition de la boucle est à la fin. Ce sont les principales différences entre le while et le do-while.
Dans le cas de la boucle while, nous pouvons directement quitter la boucle au début, si la condition n'est pas remplie alors que dans la boucle do-while, nous exécutons les instructions de boucle au moins une fois.
Les fonctions
Q # 17) Qu'entendez-vous par type de retour «nul»?
Répondre: Toutes les fonctions doivent renvoyer une valeur selon la syntaxe générale.
Cependant, si nous ne voulons pas qu'une fonction renvoie une valeur, nous utilisons ' annuler »Pour indiquer cela. Cela signifie que nous utilisons ' annuler 'Pour indiquer que la fonction n'a pas de valeur de retour ou qu'elle renvoie' annuler ».
Exemple:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 18) Expliquez Pass by Value et Pass by Reference.
Répondre: En passant des paramètres à la fonction en utilisant «Pass by Value», nous transmettons une copie des paramètres à la fonction.
Par conséquent, les modifications apportées aux paramètres de la fonction appelée ne sont pas renvoyées à la fonction appelante. Ainsi, les variables de la fonction appelante restent inchangées.
Exemple:
void printFunc(int a,int b,int c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Production:
x = 1
y = 3
z = 4
Comme vu ci-dessus, bien que les paramètres aient été modifiés dans la fonction appelée, leurs valeurs n'étaient pas reflétées dans la fonction appelante car elles étaient passées par valeur.
Cependant, si nous voulons récupérer les valeurs modifiées de la fonction vers la fonction appelante, nous utilisons la technique «Pass by Reference».
Pour démontrer cela, nous modifions le programme ci-dessus comme suit:
void printFunc(int& a,int& b,int& c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Production:
x = 2
y = 6
z = 8
Comme indiqué ci-dessus, les modifications apportées aux paramètres dans les fonctions appelées sont transmises à la fonction appelante lorsque nous utilisons la technique «Pass by reference». En effet, en utilisant cette technique, nous ne transmettons pas une copie des paramètres mais nous transmettons en fait la référence de la variable elle-même.
Q # 19) Quels sont les paramètres par défaut? Comment sont-ils évalués dans la fonction C ++?
Répondre: Le paramètre par défaut est une valeur affectée à chaque paramètre lors de la déclaration d'une fonction.
Cette valeur est utilisée si ce paramètre est laissé vide lors de l'appel à la fonction. Pour spécifier une valeur par défaut pour un paramètre particulier, nous affectons simplement une valeur au paramètre dans la déclaration de fonction.
Si la valeur n'est pas transmise pour ce paramètre lors de l'appel de fonction, le compilateur utilise la valeur par défaut fournie. Si une valeur est spécifiée, cette valeur par défaut est appliquée et la valeur transmise est utilisée.
Exemple:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Production:
12
6
Comme indiqué dans le code ci-dessus, il existe deux appels à la fonction de multiplication. Lors du premier appel, un seul paramètre est passé avec une valeur. Dans ce cas, le deuxième paramètre est la valeur par défaut fournie. Mais dans le deuxième appel, lorsque les deux valeurs de paramètre sont transmises, la valeur par défaut est remplacée et la valeur transmise est utilisée.
Q # 20) Qu'est-ce qu'une fonction Inline en C ++?
Répondre: La fonction en ligne est une fonction qui est compilée par le compilateur au moment de l'appel de la fonction et le code est remplacé à ce stade. Cela rend la compilation plus rapide. Cette fonction est définie en préfixant le prototype de fonction avec le mot-clé «inline».
De telles fonctions ne sont avantageuses que lorsque le code de la fonction en ligne est petit et simple. Bien qu'une fonction soit définie comme Inline, elle dépend entièrement du compilateur pour l'évaluer comme Inline ou non.
Structure de données avancées
Tableaux
Q # 21) Pourquoi les tableaux sont-ils généralement traités avec la boucle for?
Répondre: Array utilise l'index pour parcourir chacun de ses éléments.
Si A est un tableau alors chacun de ses éléments est accédé comme A (i). Par programme, tout ce qui est nécessaire pour que cela fonctionne est un bloc itératif avec une variable de boucle i qui sert d'index (compteur) incrémentant de 0 à A.length-1.
C'est exactement ce que fait une boucle et c'est la raison pour laquelle nous traitons les tableaux en utilisant des boucles for.
Q # 22) Indiquez la différence entre supprimer et supprimer ().
Répondre: «Delete ()» est utilisé pour libérer la mémoire allouée à un tableau qui a été alloué en utilisant new (). «Delete» est utilisé pour libérer un morceau de mémoire qui a été alloué en utilisant new.
Q # 23) Quel est le problème avec ce code?
T * p = nouveau T (10);
supprimer p;
Répondre: Le code ci-dessus est syntaxiquement correct et se compilera correctement.
Le seul problème est qu'il supprimera simplement le premier élément du tableau. Bien que le tableau entier soit supprimé, seul le destructeur du premier élément sera appelé et la mémoire du premier élément sera libérée.
Q # 24) Quel est l'ordre dans lequel les objets d'un tableau sont détruits?
Répondre: Les objets d'un tableau sont détruits dans l'ordre inverse de la construction: premier construit, dernier détruit.
Dans l'exemple suivant, l'ordre des destructeurs sera un (9), un (8),…, un (1), un (0):
voiduserCode() { Car a(10); ... }
Pointeurs
Q # 25) Quel est le problème avec ce code?
T * p = 0;
supprimer p;
Répondre: Dans le code ci-dessus, le pointeur est un pointeur nul. Selon la norme C ++ 03, il est parfaitement valide d'appeler delete sur un pointeur NULL. L'opérateur de suppression prendrait en charge la vérification NULL en interne.
Q # 26) Qu'est-ce qu'une variable de référence en C ++?
Répondre: Une variable de référence est un nom d'alias pour la variable existante. Cela signifie que le nom de la variable et la variable de référence pointent vers le même emplacement mémoire. Par conséquent, chaque fois que la variable est mise à jour, la référence est également mise à jour.
Exemple:
int a=10; int& b = a;
Ici, b est la référence de a.
Classes de stockage
Q # 27) Qu'est-ce qu'une classe de stockage? Mentionnez les classes de stockage en C ++.
Répondre: La classe de stockage détermine la durée de vie ou la portée des symboles tels que les variables ou les fonctions.
C ++ prend en charge les classes de stockage suivantes:
- Auto
- Statique
- Externe
- S'inscrire
- Mutable
Q # 28) Expliquez le spécificateur de classe de stockage Mutable.
Répondre: La variable du membre d'un objet de classe constante ne peut pas être modifiée. Cependant, en déclarant les variables comme «mutables», nous pouvons changer les valeurs de ces variables.
Q # 29) À quoi sert le mot-clé auto?
Répondre: Par défaut, chaque variable locale de la fonction est automatique, c'est-à-dire auto . Dans la fonction ci-dessous, les variables «i» et «j» sont des variables automatiques.
void f() { int i; auto int j; }
REMARQUE : Une variable globale n'est pas une variable automatique.
Q # 30) Qu'est-ce qu'une variable statique?
Répondre: Une variable statique est une variable locale qui conserve sa valeur à travers les appels de fonction. Les variables statiques sont déclarées à l'aide du mot-clé «static». Les variables numériques statiques ont la valeur par défaut égale à zéro.
La fonction suivante affichera 1 2 3 si elle est appelée trois fois.
void f() { static int i; ++i; printf(“%d “,i); }
Si une variable globale est statique, sa visibilité est limitée au même code source.
Q # 31) Quel est le but du spécificateur de stockage externe?
Répondre: Le spécificateur «Extern» est utilisé pour résoudre la portée d'un symbole global.
#include using nam espace std; main() { extern int i; cout< Dans le code ci-dessus, «i» peut être visible à l'extérieur du fichier où il est défini.
Q # 32) Expliquez le spécificateur de stockage de registre.
Répondre: La variable «Register» doit être utilisée chaque fois que la variable est utilisée. Lorsqu'une variable est déclarée avec un spécificateur «register», alors le compilateur donne le registre CPU pour son stockage afin d'accélérer la recherche de la variable.
Q # 33) Quand utiliser des arguments de référence «const» dans une fonction?
Répondre: L'utilisation d'arguments de référence «const» dans une fonction est bénéfique de plusieurs manières:
- «Const» protège des erreurs de programmation qui pourraient altérer les données.
- En raison de l'utilisation de «const», la fonction est capable de traiter à la fois des arguments réels const et non const, ce qui n'est pas possible lorsque «const» n'est pas utilisé.
- L'utilisation d'une référence const permettra à la fonction de générer et d'utiliser une variable temporaire de manière appropriée.
Structure et types de données définis par l'utilisateur
Q # 34) Qu'est-ce qu'une classe?
Répondre: La classe est un type de données défini par l'utilisateur en C ++. Il peut être créé pour résoudre un type particulier de problème. Après la création, l'utilisateur n'est pas tenu de connaître les détails du fonctionnement d'une classe.
En général, la classe agit comme un modèle de projet et peut inclure dans divers paramètres et fonctions ou actions opérant sur ces paramètres. Ceux-ci sont appelés les membres de la classe.
Q # 35) Différence entre classe et structure.
Répondre:
Structure: En langage C, la structure est utilisée pour regrouper différents types de types de données. Les variables à l'intérieur d'une structure sont appelées les membres de la structure. Ces membres sont publics par défaut et sont accessibles en utilisant le nom de la structure suivi d'un opérateur point puis du nom du membre.
Classer: La classe est un successeur de la structure. C ++ étend la définition de structure pour inclure les fonctions qui opèrent sur ses membres. Par défaut, tous les membres de la classe sont privés.
Programmation orientée objet avec C ++
Classes, constructeurs, destructeurs
Q # 36) Qu'est-ce que l'espace de noms?
Répondre: L'espace de noms nous permet de regrouper un ensemble de classes globales, d'objets et / ou de fonctions sous un nom spécifique.
La forme générale d'utilisation des espaces de noms est:
identifiant d'espace de noms {namespace-body}
Où identificateur est un identificateur valide et le corps de l'espace de noms est l'ensemble des classes, objets et fonctions qui sont inclus dans l'espace de noms. Les espaces de noms sont particulièrement utiles dans le cas où plusieurs objets peuvent avoir le même nom, ce qui entraîne des conflits de noms.
Q # 37) À quoi sert la déclaration «using»?
Répondre: L'utilisation de la déclaration est utilisée pour faire référence à un nom de l'espace de noms sans l'opérateur de résolution de portée.
Q # 38) Qu'est-ce que Name Mangling?
Répondre: Le compilateur C ++ encode les types de paramètres avec fonction / méthode dans un nom unique. Ce processus est appelé dénomination. Le processus inverse est appelé démêlage.
Exemple:
A :: b (int, long) const est mutilé comme «B__C3Ail» .
Pour un constructeur, le nom de la méthode est omis.
C'est-à-dire A :: A (int, long) const est mutilé comme «C3Ail».
Q # 39) Quelle est la différence entre un objet et une classe?
Répondre: La classe est un plan directeur d'un projet ou d'un problème à résoudre et se compose de variables et de méthodes. Ceux-ci sont appelés les membres de la classe. Nous ne pouvons pas accéder aux méthodes ou aux variables de la classe seules à moins qu'elles ne soient déclarées statiques.
Afin d'accéder aux membres de la classe et de les utiliser, nous devons créer une instance d'une classe appelée Object. La classe a une durée de vie illimitée alors qu'un objet n'a qu'une durée de vie limitée.
Q # 40) Quels sont les différents spécificateurs d'accès en C ++?
Répondre: C ++ prend en charge les spécificateurs d'accès suivants:
- Publique: Les membres de données et les fonctions sont accessibles en dehors de la classe.
- Privé: Les membres de données et les fonctions ne sont pas accessibles en dehors de la classe. L'exception est l'utilisation d'une classe d'amis.
- Protégé: Les membres de données et les fonctions ne sont accessibles qu'aux classes dérivées.
Exemple:
Décrivez PRIVÉ, PROTÉGÉ et PUBLIC ainsi que leurs différences et donnez des exemples.
class A{ int x; int y; public int a; protected bool flag; public A() : x(0) , y(0) {} //default (no argument) constructor }; main(){ A MyObj; MyObj.x = 5; // Compiler will issue a ERROR as x is private int x = MyObj.x; // Compiler will issue a compile ERROR MyObj.x is private MyObj.a = 10; // no problem; a is public member int col = MyObj.a; // no problem MyObj.flag = true; // Compiler will issue a ERROR; protected values are read only bool isFlag = MyObj.flag; // no problem
Q # 41) Qu'est-ce qu'un constructeur et comment s'appelle-t-il?
Répondre: Le constructeur est une fonction membre de la classe ayant le même nom que la classe. Il est principalement utilisé pour initialiser les membres de la classe. Par défaut, les constructeurs sont publics.
Il existe deux manières d'appeler les constructeurs:
- Implicitement: Les constructeurs sont appelés implicitement par le compilateur lorsqu'un objet de la classe est créé. Cela crée un objet sur une pile.
- Appel explicite: Lorsque l'objet d'une classe est créé à l'aide de new, les constructeurs sont appelés explicitement. Cela crée généralement un objet sur un tas.
Exemple:
class A{ int x; int y; public A() : x(0) , y(0) {} //default (no argument) constructor }; main() { A Myobj; // Implicit Constructor call. In order to allocate memory on stack, //the default constructor is implicitly called. A * pPoint = new A(); // Explicit Constructor call. In order to allocate //memory on HEAP we call the default constructor. }
Q # 42) Qu'est-ce qu'un COPY CONSTRUCTOR et quand est-il appelé?
Répondre: Un constructeur de copie est un constructeur qui accepte un objet de la même classe que son paramètre et copie ses données membres dans l'objet sur la partie gauche de l'affectation. C'est utile lorsque nous devons construire un nouvel objet de la même classe.
Exemple:
class A{ int x; int y; public int color; public A() : x(0) , y(0) {} //default (no argument) constructor public A( const A& ) ; }; A::A( const A & p ) { this->x = p.x; this->y = p.y; this->color = p.color; } main() { A Myobj; Myobj.color = 345; A Anotherobj = A( Myobj ); // now Anotherobj has color = 345 }
Q # 43) Qu'est-ce qu'un constructeur par défaut?
Répondre: Le constructeur par défaut est un constructeur qui n'a pas d'arguments ou s'il y en a, alors tous sont des arguments par défaut.
Exemple:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q # 44) Qu'est-ce qu'un constructeur de conversion?
différence entre l'arbre b et l'arbre b
Répondre: C'est un constructeur qui accepte un argument d'un type différent. Les constructeurs de conversion sont principalement utilisés pour la conversion d'un type à un autre.
Q # 45) Qu'est-ce qu'un constructeur explicite?
Répondre: Un constructeur de conversion est déclaré avec le mot clé explicite. Le compilateur n'utilise pas de constructeur explicite pour implémenter une conversion implicite de types. Son objet est expressément réservé à la construction.
Q # 46) Quel est le rôle du mot-clé Static pour une variable membre de classe?
Répondre: La variable membre statique partage une mémoire commune à tous les objets créés pour la classe respective. Nous n'avons pas besoin de faire référence à la variable membre statique à l'aide d'un objet. Cependant, il est accessible en utilisant le nom de classe lui-même.
Q # 47) Expliquez la fonction de membre statique.
Répondre: Une fonction membre statique ne peut accéder qu'à la variable membre statique de la classe. Comme les variables membres statiques, une fonction membre statique est également accessible à l'aide du nom de classe.
Q # 48) Quel est l'ordre dans lequel les objets locaux sont détruits?
Réponse: Pensez à suivre un morceau de code:
Class A{ …. }; int main() { A a; A b; ... }
Dans la fonction principale, nous avons deux objets créés l'un après l'autre. Ils sont créés dans l'ordre, d'abord a puis b. Mais lorsque ces objets sont supprimés ou s'ils sortent de la portée, le destructeur de chacun sera appelé dans l'ordre inverse dans lequel ils ont été construits.
Par conséquent, le destructeur de b sera appelé en premier suivi de a. Même si nous avons un tableau d'objets, ils seront détruits de la même manière dans l'ordre inverse de leur création.
Surcharge
Q # 49) Expliquez la surcharge de fonction et la surcharge de l'opérateur.
Répondre: C ++ prend en charge le concept de POO Polymorphisme qui signifie «plusieurs formes».
En C ++, nous avons deux types de polymorphisme, à savoir le polymorphisme à la compilation et le polymorphisme à l'exécution. Le polymorphisme à la compilation est obtenu en utilisant une technique de surcharge. Surcharger signifie simplement donner une signification supplémentaire à une entité en gardant sa signification de base intacte.
C ++ prend en charge deux types de surcharge:
Surcharge de fonction:
La surcharge de fonctions est une technique qui permet au programmeur d'avoir plus d'une fonction avec le même nom mais une liste de paramètres différente. En d'autres termes, nous surchargons la fonction avec différents arguments, c'est-à-dire que ce soit le type d'arguments, le nombre d'arguments ou l'ordre des arguments.
La surcharge de fonction n'est jamais réalisée sur son type de retour.
Surcharge de l'opérateur:
C'est encore un autre type de polymorphisme à la compilation pris en charge par C ++. En cas de surcharge d'opérateur, un opérateur est surchargé, de sorte qu'il peut fonctionner sur les types définis par l'utilisateur ainsi qu'avec les opérandes du type de données standard. Mais tout en faisant cela, la définition standard de cet opérateur reste intacte.
Par exemple, un opérateur Addition (+) qui opère sur des types de données numériques peut être surchargé pour fonctionner sur deux objets tout comme un objet de classe de nombres complexes.
Q # 50) Quelle est la différence entre la surcharge de méthode et le remplacement de méthode en C ++?
Répondre: La surcharge de méthode consiste à avoir des fonctions avec le même nom mais des listes d'arguments différentes. C'est une forme de polymorphisme à la compilation.
Le remplacement de méthode entre en scène lorsque nous réécrivons la méthode dérivée d'une classe de base. La substitution de méthode est utilisée lors du traitement du polymorphisme d'exécution ou des fonctions virtuelles.
Q # 51) Quelle est la différence entre un constructeur de copie et un Opérateur d'assignation?
Répondre: Un constructeur de copie et un opérateur d'assignation surchargé servent essentiellement le même objectif, c'est-à-dire assigner le contenu d'un objet à un autre. Mais encore, il y a une différence entre les deux.
Exemple:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
Dans l'exemple ci-dessus, la deuxième instruction c1 = c2 est une instruction d'affectation surchargée.
Ici, c1 et c2 sont déjà des objets existants et le contenu de c2 est affecté à l'objet c1. Par conséquent, pour une instruction d'affectation surchargée, les deux objets doivent déjà être créés.
L'instruction suivante, complex c3 = c2 est un exemple du constructeur de copie. Ici, le contenu de c2 est assigné à un nouvel objet c3, ce qui signifie que le constructeur de copie crée un nouvel objet à chaque fois qu'il s'exécute.
Q # 52) Nommez les opérateurs qui ne peuvent pas être surchargés.
Répondre:
- sizeof - taille de l'opérateur
- . - Opérateur de point
- . * - opérateur de déréférencement
- -> - opérateur de déréférencement de membre
- :: - opérateur de résolution de portée
- ?: - opérateur conditionnel
Q # 53) La fonction peut être surchargée en fonction du paramètre qui est une valeur ou une référence. Expliquez si l'énoncé est vrai.
Répondre: Faux. Les deux, Passer par valeur et Passer par référence semblent identiques à l'appelant.
Q # 54) Quels sont les avantages de la surcharge de l'opérateur?
Répondre: En surchargeant des opérateurs standard sur une classe, nous pouvons étendre la signification de ces opérateurs, afin qu'ils puissent également opérer sur les autres objets définis par l'utilisateur.
La surcharge de fonctions nous permet de réduire la complexité du code et de le rendre plus clair et lisible car nous pouvons avoir les mêmes noms de fonction avec des listes d'arguments différentes.
Héritage
Q # 55) Qu'est-ce que l'héritage?
Répondre: L'héritage est un processus par lequel nous pouvons acquérir les caractéristiques d'une entité existante et former une nouvelle entité en y ajoutant plus de fonctionnalités.
En termes de C ++, l'héritage crée une nouvelle classe en la dérivant d'une classe existante afin que cette nouvelle classe ait les propriétés de sa classe parente ainsi que la sienne propre.
Q # 56) Quels sont les avantages de l'héritage?
Répondre: L'héritage permet la réutilisation du code, ce qui permet de gagner du temps sur le développement du code.
En héritant, nous utilisons un logiciel de haute qualité sans bogue qui réduit les problèmes futurs.
Q # 57) C ++ prend-il en charge les héritages multiniveaux et multiples?
Répondre: Oui.
Q # 58) Que sont les héritages multiples (héritage virtuel)? Quels sont ses avantages et ses inconvénients?
Répondre: Dans les héritages multiples, nous avons plus d'une classe de base dont une classe dérivée peut hériter. Par conséquent, une classe dérivée prend les fonctionnalités et propriétés de plusieurs classes de base.
Par exemple , une classe chauffeur aura deux classes de base à savoir, employé et une personne parce qu'un conducteur est un employé aussi bien qu'une personne. Ceci est avantageux car la classe de pilote peut hériter des propriétés de l'employé ainsi que de la classe de personne.
Mais dans le cas d'un employé et d'une personne, la classe aura certaines propriétés en commun. Cependant, une situation ambiguë se produira car la classe de pilote ne connaîtra pas les classes dont les propriétés communes doivent être héritées. C'est le principal inconvénient des héritages multiples.
Q # 59) Expliquez les relations de classe ISA et HASA. Comment implémenteriez-vous chaque?
Répondre: La relation «ISA» présente généralement un héritage car elle implique qu'une classe «ISA» version spécialisée d'une autre classe. Par exemple , Un employé ISA. Cela signifie qu'une classe Employee est héritée de la classe Person.
Contrairement à «ISA», la relation «HASA» montre qu'une entité peut avoir une autre entité comme membre ou qu'une classe a un autre objet incorporé à l'intérieur.
Donc, en prenant le même exemple d'une classe Employee, la manière dont nous associons la classe Salary à l'employé n'est pas en l'héritant mais en incluant ou en contenant l'objet Salary dans la classe Employee. La relation «HASA» est mieux présentée par confinement ou agrégation.
Q # 60) Une classe dérivée hérite-t-elle ou n'hérite pas?
Répondre: Lorsqu'une classe dérivée est construite à partir d'une classe de base particulière, elle hérite essentiellement de toutes les fonctionnalités et des membres ordinaires de la classe de base. Mais il y a quelques exceptions à cette règle. Par exemple, une classe dérivée n’hérite pas des constructeurs et destructeurs de la classe de base.
Chaque classe a ses propres constructeurs et destructeurs. La classe dérivée n'hérite pas non plus de l'opérateur d'affectation de la classe de base et des amis de la classe. La raison en est que ces entités sont spécifiques à une classe particulière et si une autre classe est dérivée ou si elle est l'amie de cette classe, elles ne peuvent pas leur être transmises.
Polymorphisme
Q # 61) Qu'est-ce que le polymorphisme?
Répondre: L'idée de base du polymorphisme se présente sous de nombreuses formes. En C ++, nous avons deux types de polymorphisme:
(i) Polymorphisme à la compilation
Dans le polymorphisme à la compilation, nous obtenons de nombreuses formes par surcharge. Par conséquent, nous avons une surcharge d'opérateur et une surcharge de fonction. (Nous avons déjà couvert cela ci-dessus)
(ii) Polymorphisme d'exécution
C'est le polymorphisme des classes et des objets. L'idée générale est qu'une classe de base peut être héritée par plusieurs classes. Un pointeur de classe de base peut pointer vers sa classe enfant et un tableau de classe de base peut stocker différents objets de classe enfant.
Cela signifie qu'un objet réagit différemment au même appel de fonction. Ce type de polymorphisme peut utiliser un mécanisme de fonction virtuelle.
Q # 62) Que sont les fonctions virtuelles?
Répondre: Une fonction virtuelle permet aux classes dérivées de remplacer l'implémentation fournie par la classe de base.
Chaque fois que nous avons des fonctions avec le même nom dans la base ainsi que dans la classe dérivée, il se produit une ambiguïté lorsque nous essayons d'accéder à l'objet de classe enfant à l'aide d'un pointeur de classe de base. Comme nous utilisons un pointeur de classe de base, la fonction appelée est la fonction de classe de base avec le même nom.
Pour corriger cette ambiguïté, nous utilisons le mot-clé «virtuel» avant le prototype de fonction dans la classe de base. En d'autres termes, nous rendons cette fonction polymorphe virtuelle. En utilisant une fonction virtuelle, nous pouvons supprimer l'ambiguïté et accéder correctement à toutes les fonctions de classe enfant à l'aide d'un pointeur de classe de base.
Q # 63) Donnez un exemple de polymorphisme d'exécution / fonctions virtuelles.
Répondre:
class SHAPE{ public virtual Draw() = 0; //abstract class with a pure virtual method }; class CIRCLE: public SHAPE{ public int r; public Draw() { this->drawCircle(0,0,r); } }; class SQUARE: public SHAPE{ public int a; public Draw() { this->drawSquare(0,0,a,a); } }; int main() { SHAPE shape1*; SHAPE shape2*; CIRCLE c1; SQUARE s1; shape1 = &c1; shape2 = &s1; coutDans le code ci-dessus, la classe SHAPE a une fonction virtuelle pure et est une classe abstraite (ne peut pas être instanciée). Chaque classe est dérivée de SHAPE implémentant la fonction Draw () à sa manière.
De plus, chaque fonction Draw est virtuelle de sorte que lorsque nous utilisons un pointeur de classe de base (SHAPE) à chaque fois avec l'objet des classes dérivées (Circle et SQUARE), alors les fonctions Draw appropriées sont appelées.
Q # 64) Qu'entendez-vous par Pure Virtual Functions?
Répondre: Une fonction membre virtuelle pure est une fonction membre dans laquelle la classe de base force les classes dérivées à se substituer. Normalement, cette fonction membre n'a pas d'implémentation. Les fonctions virtuelles pures sont égales à zéro.
Exemple:
class Shape { public: virtual void draw() = 0; };
La classe de base qui a une fonction virtuelle pure comme membre peut être qualifiée de «classe abstraite». Cette classe ne peut pas être instanciée et elle agit généralement comme un modèle comportant plusieurs sous-classes avec une implémentation supplémentaire.
Q # 65) Que sont les constructeurs / destructeurs virtuels?
Répondre:
Destructeurs virtuels: Lorsque nous utilisons un pointeur de classe de base pointant vers un objet de classe dérivée et que nous l'utilisons pour le détruire, au lieu d'appeler le destructeur de classe dérivée, le destructeur de classe de base est appelé.
Exemple:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Comme indiqué dans l'exemple ci-dessus, lorsque nous disons supprimer a, le destructeur est appelé mais il s'agit en fait du destructeur de classe de base. Cela donne lieu à l'ambiguïté que toute la mémoire détenue par b ne sera pas effacée correctement.
Ce problème peut être résolu en utilisant le concept «Virtual Destructor».
Ce que nous faisons, c'est que nous créons le constructeur de classe de base «Virtuel» afin que tous les destructeurs de classe enfant deviennent également virtuels et lorsque nous supprimons l'objet de la classe de base pointant vers l'objet de la classe dérivée, le destructeur approprié est appelé et tout les objets sont correctement supprimés.
Ceci est montré comme suit:
comment écrire des cas de test dans des tests logiciels avec exemple
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Constructeur virtuel : Les constructeurs ne peuvent pas être virtuels. Déclarer un constructeur en tant que fonction virtuelle est une erreur de syntaxe.
Ami
Q # 66) Qu'est-ce qu'une fonction ami?
Répondre: La classe C ++ ne permet pas d'accéder à ses membres privés et protégés en dehors de la classe. Mais cette règle peut être violée en utilisant le ' Ami ' fonction.
Comme son nom l'indique, la fonction ami est une fonction externe qui est un ami de la classe. Pour que la fonction friend accède aux méthodes privées et protégées de la classe, nous devrions avoir un prototype de la fonction friend avec le mot-clé 'friend' inclus dans la classe.
Q # 67) Qu'est-ce qu'une classe d'amis?
Répondre: Les classes Friend sont utilisées lorsque nous devons remplacer la règle pour les spécificateurs d'accès privé et protégé afin que deux classes puissent travailler en étroite collaboration l'une avec l'autre.
Par conséquent, nous pouvons avoir une classe d'amis pour être ami d'une autre classe. De cette façon, les classes d'amis peuvent garder les choses privées et inaccessibles telles qu'elles sont.
Lorsque nous avons une exigence pour accéder à l'implémentation interne d'une classe (membre privé) sans exposer les détails en rendant le public, nous optons pour des fonctions amis.
C ++ avancé
Modèles
Q # 68) Qu'est-ce qu'un modèle?
Répondre: Les modèles permettent de créer des fonctions indépendantes du type de données (génériques) et peuvent prendre n'importe quel type de données comme paramètres et valeur de retour sans avoir à surcharger la fonction avec tous les types de données possibles. Les modèles remplissent presque la fonctionnalité d'une macro.
Son prototype est l'un des suivants:
modèle identifier > function_declaration;
modèle identifier > function_declaration;
La seule différence entre les deux prototypes est l'utilisation du mot-clé class ou typename. Leur fonctionnalité de base d'être générique reste la même.
Gestion des exceptions
Q # 69) Qu'est-ce que la gestion des exceptions? C ++ prend-il en charge la gestion des exceptions?
Répondre: Oui, C ++ prend en charge la gestion des exceptions.
Nous ne pouvons pas garantir que le code s'exécutera normalement à tout moment. Certaines situations peuvent entraîner un dysfonctionnement du code que nous avons écrit, même s'il est sans erreur. Ce dysfonctionnement du code s'appelle Exception .
Lorsqu'une exception s'est produite, le compilateur doit la lancer pour que nous sachions qu'une exception s'est produite. Lorsqu'une exception a été levée, le compilateur doit s'assurer qu'elle est gérée correctement, afin que le flux du programme continue ou se termine correctement. C'est ce qu'on appelle le traitement d'une exception.
Ainsi en C ++, nous avons trois mots-clés i.e. essayer , lancer et capture qui sont dans la gestion des exceptions.
La syntaxe générale du bloc d'exception est:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Comme indiqué ci-dessus, le code qui pourrait potentiellement mal fonctionner est placé sous le bloc try. Lorsque le code fonctionne mal, une exception est levée. Cette exception est ensuite interceptée sous le bloc catch et est gérée, c'est-à-dire qu'une action appropriée est prise.
Q # 70) Commentez les exceptions standard C ++?
Répondre: C ++ prend en charge certaines exceptions standard qui peuvent être interceptées si nous mettons le code dans le bloc try. Ces exceptions font partie de la classe de base ' std :: exception ». Cette classe est définie dans le fichier d'en-tête C ++.
Quelques exemples d'exceptions prises en charge par cette classe incluent:
bad_alloc - lancé par 'nouveau'
runtime_error - généré pour les erreurs d'exécution
bad_typeid - lancé par l'ID de type
Introduction à la bibliothèque de modèles standard
Q # 71) Qu'est-ce qu'une bibliothèque de modèles standard (STL)? Quels sont les différents types de conteneurs STL?
Répondre: Une bibliothèque de modèles standard (STL) est une bibliothèque de modèles de conteneurs approuvés par le comité ANSI pour inclusion dans la spécification C ++ standard. Nous avons différents types de conteneurs STL en fonction de la façon dont ils stockent les éléments.
- File d'attente, pile - Ce sont les mêmes que la file d'attente et la pile traditionnelles et sont appelés conteneurs adaptatifs.
- Ensemble, carte - Ce sont essentiellement des conteneurs qui ont des paires clé / valeur et sont de nature associative.
- Vecteur et - Ceux-ci sont de nature séquentielle et présentent des similitudes avec les tableaux.
Q # 72) Qu'est-ce qu'une classe Iterator?
Répondre: En C ++, une classe conteneur est une collection d'objets différents.
Si nous avons besoin de parcourir cette collection d'objets, nous ne pouvons pas le faire en utilisant de simples variables d'index. Par conséquent, nous avons une classe spéciale dans STL appelée un Itérateur classe qui peut être utilisée pour parcourir le contenu de la classe conteneur.
Les différentes catégories d'itérateurs comprennent itérateurs d'entrée, itérateurs de sortie, itérateurs avant, itérateurs bidirectionnels, accès aléatoire, etc.
Q # 73) Quelle est la différence entre un itérateur externe et un itérateur interne? Décrivez un avantage de l'itérateur externe.
Répondre: Un itérateur interne est implémenté avec les fonctions membres de la classe qui a des éléments à parcourir.
Un itérateur externe est implémenté en tant que classe distincte qui peut être liée à l'objet contenant des éléments à parcourir. L’avantage fondamental d’un itérateur externe est qu’il est facile à mettre en œuvre car il est implémenté en tant que classe distincte.
Deuxièmement, comme il s’agit d’une classe différente, de nombreux objets d’itération peuvent être actifs simultanément.
Lectures complémentaires => Questions d'entrevue C #
Conclusion
Presque tous les principaux sujets de codage et de programmation de l'entrevue C ++ sont traités dans cet article.
Nous espérons que tout candidat se sentira détendu après avoir préparé un entretien en utilisant cette série de questions d'entrevue.
Tout le meilleur pour votre entretien !!
lecture recommandée
- Questions et réponses d'entrevue
- Questions et réponses d'entrevue de test ETL
- Quelques questions et réponses difficiles sur les tests manuels
- 25 meilleures questions et réponses d'entrevue de test Agile
- Questions d'entrevue Spock avec réponses (les plus populaires)
- Quelques questions d'entretien intéressantes sur les tests de logiciels
- Top 20+ Questions et réponses d'entrevue .NET
- Top 32 des meilleures questions et réponses d'entrevue de datastage