top 70 c interview questions
Domande di intervista C ++ di base e avanzate più frequenti con esempi di codice per candidati entry-level e professionisti esperti:
Questo articolo dettagliato sarà sicuramente un segnalibro per coloro che si stanno preparando per un'intervista in C ++.
Quasi tutti i principali argomenti in C ++ sono trattati qui insieme ad alcune domande di base su argomenti avanzati come Standard Template Library (STL), ecc.
Questa serie di domande sulla codifica C ++ ti aiuterà ad affrontare con sicurezza qualsiasi intervista C ++ e a risolverla con successo al primo tentativo.
Cosa imparerai:
- Domande di intervista in C ++ con esempi di codice
Domande di intervista in C ++ con esempi di codice
Di seguito sono elencate le domande di intervista di programmazione C ++ più popolari a cui hanno risposto un esperto di C ++.
Leggi anche => Top domande di colloquio di programmazione C.
C ++ di base
Struttura del programma C ++
D # 1) Qual è la struttura di base di un programma C ++?
Risposta: La struttura di base di un programma C ++ è mostrata di seguito:
#include int main() { cout<<”Hello,World!”; return 0; }
La prima riga che inizia con ' # ' è un direttiva del preprocessore . In questo caso, stiamo usando includere come una direttiva che dice al compilatore di includere un'intestazione mentre ' iostream.h ”Che verrà utilizzato per input / output di base più avanti nel programma.
La riga successiva è la funzione 'main' che restituisce un numero intero. La funzione principale è il punto di partenza dell'esecuzione di qualsiasi programma C ++. Indipendentemente dalla sua posizione nel file del codice sorgente, il contenuto della funzione principale viene sempre eseguito per primo dal compilatore C ++.
Nella riga successiva, possiamo vedere le parentesi graffe aperte che indicano l'inizio di un blocco di codice. Dopo di ciò, vediamo l'istruzione di programmazione o la riga di codice che utilizza il conteggio che è il flusso di output standard (la sua definizione è presente in iostream.h).
Questo flusso di output accetta una stringa di caratteri e la stampa su un dispositivo di output standard. In questo caso, è 'Hello, World!'. Si noti che ogni istruzione C ++ termina con un punto e virgola (;), che è assolutamente necessario e ometterlo comporterà errori di compilazione.
Prima di chiudere le parentesi graffe}, vediamo un'altra riga 'return 0;'. Questo è il punto di ritorno alla funzione principale.
Ogni programma C ++ avrà una struttura di base come mostrato sopra con una direttiva del preprocessore, la dichiarazione della funzione principale seguita da un blocco di codice e quindi un punto di ritorno alla funzione principale che indica la corretta esecuzione del programma.
D # 2) Quali sono i commenti in C ++?
Risposta: I commenti in C ++ sono semplicemente un pezzo di codice sorgente ignorato dal compilatore. Sono utili solo per un programmatore per aggiungere una descrizione o ulteriori informazioni sul proprio codice sorgente.
In C ++ ci sono due modi per aggiungere commenti:
- // commento su una sola riga
- / * blocco commento * /
Il primo tipo eliminerà tutto dopo che il compilatore ha rilevato '//'. Nel secondo tipo, il compilatore scarta tutto ciò che si trova tra '/ *' e '* /'.
Variabili, tipi di dati e costanti
D # 3) Differenza tra dichiarazione e definizione di una variabile.
Risposta: La dichiarazione di una variabile sta semplicemente specificando il tipo di dati di una variabile e il nome della variabile. Come risultato della dichiarazione, diciamo al compilatore di riservare lo spazio per una variabile nella memoria in base al tipo di dati specificato.
Esempio:
int Result; char c; int a,b,c;
Tutte le precedenti sono dichiarazioni valide. Inoltre, si noti che come risultato della dichiarazione, il valore della variabile è indeterminato.
Considerando che, una definizione è un'implementazione / istanza della variabile dichiarata in cui leghiamo un valore appropriato alla variabile dichiarata in modo che il linker sarà in grado di collegare i riferimenti alle entità appropriate.
Dall'esempio sopra ,
Risultato = 10;
C = 'A';
Queste sono definizioni valide.
D # 4) Commentare l'ambito locale e globale di una variabile.
Risposta: L'ambito di una variabile è definito come l'estensione del codice del programma all'interno del quale la variabile rimane attiva, ovvero può essere dichiarata, definita o utilizzata.
Esistono due tipi di ambito in C ++:
- Ambito locale: Si dice che una variabile abbia un ambito locale o sia locale quando viene dichiarata all'interno di un blocco di codice. La variabile rimane attiva solo all'interno del blocco e non è accessibile all'esterno del blocco di codice.
- Ambito globale: Una variabile ha un ambito globale quando è accessibile in tutto il programma. Una variabile globale viene dichiarata in cima al programma prima di tutte le definizioni di funzione.
Esempio:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
D # 5) Qual è la precedenza quando nel programma sono presenti una variabile globale e una variabile locale con lo stesso nome?
Risposta: Ogni volta che c'è una variabile locale con lo stesso nome di quella di una variabile globale, il compilatore dà la precedenza alla variabile locale.
Esempio:
#include int globalVar = 2; int main() { int globalVar = 5; cout<L'output del codice precedente è 5. Questo perché, sebbene entrambe le variabili abbiano lo stesso nome, il compilatore ha dato la preferenza all'ambito locale.
Q # 6) Quando ci sono una variabile globale e una variabile locale con lo stesso nome, come accederai alla variabile globale?
Risposta: Quando ci sono due variabili con lo stesso nome ma un ambito diverso, cioè una è una variabile locale e l'altra è una variabile globale, il compilatore darà la preferenza a una variabile locale.
Per accedere alla variabile globale, utilizziamo un ' operatore di risoluzione dell'ambito (: :) '. Usando questo operatore, possiamo accedere al valore della variabile globale.
Esempio:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Produzione:
Variabile globale x = 10
Variabile locale x = 2
D # 7) Quanti modi ci sono per inizializzare un int con una costante?
Risposta: Ci sono due modi:
- Il primo formato utilizza la notazione C tradizionale.
risultato int = 10; - Il secondo formato utilizza la notazione del costruttore.
int risultato (10);
Costanti
Q # 8) Cos'è una costante? Spiega con un esempio.
Risposta: Una costante è un'espressione che ha un valore fisso. Possono essere divisi in costanti intere, decimali, a virgola mobile, carattere o stringa a seconda del tipo di dati.
Oltre al decimale, C ++ supporta anche altre due costanti, ovvero ottale (alla base 8) ed esadecimale (alla base 16).
Esempi di costanti:
- 75 // intero (decimale)
- 0113 // ottale
- 0x4b // esadecimale
- 3.142 // virgola mobile
- 'C' // costante di carattere
- 'Hello, World' // costante di stringa
Nota: Quando dobbiamo rappresentare un singolo carattere, usiamo virgolette singole e quando vogliamo definire una costante con più di un carattere, usiamo virgolette doppie.
Q # 9) Come definite / dichiarate le costanti in C ++?
Risposta: In C ++, possiamo definire le nostre costanti utilizzando il #definire direttiva del preprocessore.
#define Valore identificativo
Esempio:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Produzione: Area di un cerchio = 78,55
Come mostrato nell'esempio precedente, una volta definita una costante utilizzando la direttiva #define, possiamo usarla in tutto il programma e sostituirne il valore.
Possiamo dichiarare costanti in C ++ utilizzando il ' const ' parola chiave. Questo modo è simile a quello di dichiarare una variabile, ma con un prefisso const.
Esempi di dichiarazione di una costante
const int pi = 3,142;
const char c = 'sth';
codice postale const = 411014;
Negli esempi precedenti, ogni volta che il tipo di una costante non è specificato, il compilatore C ++ lo imposta per impostazione predefinita su un tipo intero.
Operatori
D # 10) Commenta l'operatore di assegnazione in C ++.
Risposta: L'operatore di assegnazione in C ++ viene utilizzato per assegnare un valore a un'altra variabile.
a = 5;
Questa riga di codice assegna il valore intero 5 a variabile per .
La parte a sinistra dell'operatore = è nota come lvalue (valore a sinistra) e a destra come rvalue (valore corretto). L valore deve essere sempre una variabile mentre il lato destro può essere una costante, una variabile, il risultato di un'operazione o qualsiasi combinazione di esse.
L'operazione di assegnazione avviene sempre da destra verso sinistra e mai al contrario.
Una proprietà che C ++ ha sugli altri linguaggi di programmazione è che l'operatore di assegnazione può essere utilizzato come rvalue (o parte di un file rvalue ) per un altro incarico.
Esempio:
a = 2 + (b = 5);
è equivalente a:
b = 5;
a = 2 + b;
Il che significa, prima assegnazione 5 a variabile b e quindi assegnare a per, il valore Due più il risultato della precedente espressione di b (che è 5), foglie per con un valore finale di 7 .
Pertanto, la seguente espressione è valida anche in C ++:
a = b = c = 5;
assegnare 5 alle variabili per , b e c .
D # 11) Qual è la differenza tra uguale a (==) e Operatore di assegnazione (=)?
Risposta: In C ++, uguale a (==) e operatore di assegnazione (=) sono due operatori completamente diversi.
Uguale a (==) è un operatore relazionale di uguaglianza che valuta due espressioni per vedere se sono uguali e restituisce true se sono uguali e false se non lo sono.
L'operatore di assegnazione (=) viene utilizzato per assegnare un valore a una variabile. Quindi, possiamo avere un'operazione di assegnazione complessa all'interno dell'operatore relazionale di uguaglianza per la valutazione.
D # 12) Quali sono i vari operatori aritmetici in C ++?
Risposta: C ++ supporta i seguenti operatori aritmetici:
- + aggiunta
- - sottrazione
- * moltiplicazione
- / divisione
- modulo%
Dimostriamo i vari operatori aritmetici con la seguente parte di codice.
Esempio:
#include int main () { int a=5, b=3; cout<<”a + b = “< Produzione :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Come mostrato sopra, tutte le altre operazioni sono dirette e uguali alle operazioni aritmetiche effettive, tranne l'operatore modulo che è abbastanza diverso. L'operatore modulo divide aeb e il risultato dell'operazione è il resto della divisione.
D # 13) Quali sono i vari operatori di assegnazione composta in C ++?
Risposta: Di seguito sono riportati gli operatori di assegnazione composti in C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
L'operatore di assegnazione composto è una delle caratteristiche più importanti del linguaggio C ++ che ci permette di cambiare il valore di una variabile con uno degli operatori di base:
Esempio:
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;
D # 14) Indicare la differenza tra operazioni pre e post incremento / decremento.
Risposta: C ++ consente due operatori, ovvero ++ (incremento) e - (decremento), che consentono di aggiungere 1 al valore esistente di una variabile e sottrarre 1 dalla variabile rispettivamente. Questi operatori sono a loro volta chiamati incremento (++) e decremento (-).
Esempio:
a = 5;
a ++;
La seconda istruzione, a ++, farà sì che 1 venga aggiunto al valore di a. Quindi un ++ è equivalente a
a = a + 1; o
a + = 1;
Una caratteristica unica di questi operatori è che possiamo aggiungere come prefisso o suffisso a questi operatori la variabile. Quindi, se a è una variabile e anteponiamo l'operatore di incremento, sarà
++ a;
Questo si chiama Pre-incremento. Allo stesso modo, abbiamo anche il pre-decremento.
Se anteponiamo alla variabile a un operatore di incremento, avremo,
a ++;
Questo è il post-incremento. Allo stesso modo, abbiamo anche il post-decremento.
La differenza tra il significato di pre e post dipende da come l'espressione viene valutata e il risultato viene memorizzato.
Nel caso dell'operatore di pre-incremento / decremento, viene eseguita prima l'operazione di incremento / decremento e poi il risultato viene passato ad un lvalue. Mentre per le operazioni di post-incremento / decremento, il valore l viene valutato per primo e quindi l'incremento / decremento viene eseguito di conseguenza.
Esempio:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-un; # a = 5
b ++; # 6
I / O tramite console
D # 15) Cosa sono gli operatori di estrazione e inserimento in C ++? Spiega con esempi.
Risposta: Nella libreria iostream.h di C ++, Cina , e costo sono i due flussi di dati utilizzati rispettivamente per l'input e l'output. Cout è normalmente diretto allo schermo e cin è assegnato alla tastiera.
'Cin' (operatore di estrazione): Utilizzando l'operatore di overload >> con il flusso cin, C ++ gestisce l'input standard.
int age; cin>>age;
Come mostrato nell'esempio precedente, viene dichiarata una variabile intera 'età' e quindi attende che cin (tastiera) inserisca i dati. “Cin” elabora l'input solo quando viene premuto il tasto RETURN.
'Cout' (operatore di inserimento): Viene utilizzato insieme al sovraccarico<< operator. It directs the data that followed it into the cout stream.
Esempio:
alternativa gratuita ai libri rapidi per le piccole imprese
cout<<”Hello, World!”; cout<<123;
Strutture e funzioni di controllo
Strutture e loop di controllo
D # 16) Qual'è la differenza tra while e do while loop? Spiega con esempi.
Risposta: Il formato del ciclo while in C ++ è:
While (espressione)
{dichiarazioni;}
Il blocco di istruzioni in while viene eseguito fintanto che la condizione nell'espressione data è vera.
Esempio:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<Nel codice sopra, il ciclo uscirà direttamente se n è 0. Pertanto, nel ciclo while, la condizione di terminazione è all'inizio del ciclo e, se è soddisfatta, non vengono eseguite iterazioni del ciclo.
Successivamente, consideriamo il ciclo do-while.
Il formato generale del do-while è:
do {istruzione;} while (condizione);
Esempio:
#include int main() { int n; cout<>n; do { cout<Nel codice sopra, possiamo vedere che l'istruzione all'interno del ciclo viene eseguita almeno una volta poiché la condizione del ciclo è alla fine. Queste sono le principali differenze tra il while e il do-while.
Nel caso del ciclo while, possiamo uscire direttamente dal ciclo all'inizio, se la condizione non è soddisfatta mentre nel ciclo do-while eseguiamo le istruzioni del ciclo almeno una volta.
Funzioni
Q # 17) Cosa intendi per tipo di ritorno 'void'?
Risposta: Tutte le funzioni dovrebbero restituire un valore secondo la sintassi generale.
Tuttavia, nel caso in cui non vogliamo che una funzione restituisca alcun valore, utilizziamo ' vuoto 'Per indicarlo. Ciò significa che usiamo ' vuoto 'Per indicare che la funzione non ha valore di ritorno o restituisce' vuoto '.
Esempio:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
D # 18) Spiega Passa per valore e Passa per riferimento.
Risposta: Durante il passaggio dei parametri alla funzione utilizzando 'Passa per valore', si passa una copia dei parametri alla funzione.
Pertanto, qualsiasi modifica apportata ai parametri nella funzione chiamata non viene restituita alla funzione chiamante. Pertanto le variabili nella funzione chiamante rimangono invariate.
Esempio:
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 = “< Produzione:
x = 1
y = 3
z = 4
Come visto sopra, sebbene i parametri siano stati modificati nella funzione chiamata, i loro valori non si riflettevano nella funzione chiamante poiché venivano passati per valore.
Tuttavia, se vogliamo riportare i valori modificati dalla funzione alla funzione chiamante, allora usiamo la tecnica 'Passa per riferimento'.
Per dimostrarlo, modifichiamo il programma sopra come segue:
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 = “< Produzione:
x = 2
y = 6
z = 8
Come mostrato sopra, le modifiche apportate ai parametri nelle funzioni chiamate vengono passate alla funzione chiamante quando si utilizza la tecnica “Passa per riferimento”. Questo perché usando questa tecnica non passiamo una copia dei parametri ma in realtà passiamo il riferimento della variabile stessa.
D # 19) Cosa sono i parametri predefiniti? Come vengono valutati nella funzione C ++?
Risposta: Il parametro predefinito è un valore assegnato a ciascun parametro durante la dichiarazione di una funzione.
Questo valore viene utilizzato se il parametro viene lasciato vuoto durante la chiamata alla funzione. Per specificare un valore predefinito per un particolare parametro, assegniamo semplicemente un valore al parametro nella dichiarazione della funzione.
Se il valore non viene passato per questo parametro durante la chiamata alla funzione, il compilatore utilizza il valore predefinito fornito. Se viene specificato un valore, viene applicato questo valore predefinito e viene utilizzato il valore passato.
Esempio:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Produzione:
12
6
Come mostrato nel codice sopra, ci sono due chiamate per moltiplicare la funzione. Nella prima chiamata, solo un parametro viene passato con un valore. In questo caso, il secondo parametro è il valore predefinito fornito. Ma nella seconda chiamata, poiché vengono passati entrambi i valori dei parametri, il valore predefinito viene sovrascritto e viene utilizzato il valore passato.
D # 20) Cos'è una funzione inline in C ++?
Risposta: La funzione inline è una funzione che viene compilata dal compilatore come punto di chiamata della funzione e il codice viene sostituito a quel punto. Questo rende la compilazione più veloce. Questa funzione viene definita anteponendo al prototipo della funzione la parola chiave 'inline'.
Tali funzioni sono vantaggiose solo quando il codice della funzione inline è piccolo e semplice. Sebbene una funzione sia definita come Inline, dipende completamente dal compilatore per valutarla come inline o meno.
Struttura dati avanzata
Arrays
D # 21) Perché gli array vengono solitamente elaborati con il ciclo for?
Risposta: Array utilizza l'indice per attraversare ciascuno dei suoi elementi.
Se A è un array, si accede a ciascuno dei suoi elementi come A [i]. A livello di codice, tutto ciò che è necessario perché funzioni è un blocco iterativo con una variabile di ciclo i che funge da indice (contatore) che aumenta da 0 a A.length-1.
Questo è esattamente ciò che fa un ciclo e questo è il motivo per cui elaboriamo gli array usando i cicli for.
Q # 22) Indica la differenza tra elimina ed elimina [].
Risposta: 'Delete []' viene utilizzato per rilasciare la memoria allocata a un array che è stato allocato utilizzando new []. 'Cancella' viene utilizzato per rilasciare un blocco di memoria che è stato allocato utilizzando new.
Q # 23) Cosa c'è di sbagliato in questo codice?
T * p = nuovo T [10];
eliminare p;
Risposta: Il codice sopra è sintatticamente corretto e verrà compilato correttamente.
L'unico problema è che cancellerà semplicemente il primo elemento dell'array. Sebbene l'intero array venga eliminato, verrà chiamato solo il distruttore del primo elemento e verrà rilasciata la memoria per il primo elemento.
D # 24) Qual è l'ordine in cui gli oggetti in un array vengono distrutti?
Risposta: Gli oggetti in una matrice vengono distrutti nell'ordine inverso rispetto alla costruzione: primo costruito, ultimo distrutto.
Nell'esempio seguente, l'ordine per i distruttori sarà a [9], a [8], ..., a [1], a [0]:
voiduserCode() { Car a[10]; ... }
Puntatori
Q # 25) Cosa c'è di sbagliato in questo codice?
T * p = 0;
eliminare p;
Risposta: Nel codice precedente, il puntatore è un puntatore nullo. Secondo lo standard C ++ 03, è perfettamente valido chiamare delete su un puntatore NULL. L'operatore di cancellazione si occuperà internamente del controllo NULL.
D # 26) Che cos'è una variabile di riferimento in C ++?
Risposta: Una variabile di riferimento è un nome alias per la variabile esistente. Ciò significa che sia il nome della variabile che la variabile di riferimento puntano alla stessa posizione di memoria. Quindi, ogni volta che la variabile viene aggiornata, viene aggiornato anche il riferimento.
Esempio:
int a=10; int& b = a;
Qui, b è il riferimento di a.
Classi di archiviazione
D # 27) Che cos'è una classe di archiviazione? Menziona le classi di archiviazione in C ++.
Risposta: La classe di archiviazione determina la durata o l'ambito di simboli come variabili o funzioni.
C ++ supporta le seguenti classi di archiviazione:
- Auto
- Statico
- Esterno
- Registrati
- Mutevole
D # 28) Spiegare l'identificatore della classe di archiviazione modificabile.
Risposta: La variabile del membro di un oggetto di classe costante non può essere modificata. Tuttavia, dichiarando le variabili come 'mutabili', possiamo modificare i valori di queste variabili.
D # 29) A cosa serve la parola chiave auto?
Risposta: Per impostazione predefinita, ogni variabile locale della funzione è automatica, ad es. auto . Nella funzione sottostante entrambe le variabili 'i' e 'j' sono variabili automatiche.
void f() { int i; auto int j; }
NOTA : Una variabile globale non è una variabile automatica.
Q # 30) Che cos'è una variabile statica?
Risposta: Una variabile statica è una variabile locale che mantiene il suo valore attraverso le chiamate di funzione. Le variabili statiche vengono dichiarate utilizzando la parola chiave 'statica'. Le variabili numeriche statiche hanno il valore predefinito zero.
La seguente funzione stamperà 1 2 3 se chiamata tre volte.
void f() { static int i; ++i; printf(“%d “,i); }
Se una variabile globale è statica, la sua visibilità è limitata allo stesso codice sorgente.
D # 31) Qual è lo scopo di Extern Storage Specifier?
domande e risposte del colloquio di test delle applicazioni mobili
Risposta: L'identificatore 'Extern' viene utilizzato per risolvere l'ambito di un simbolo globale.
#include using nam espace std; main() { extern int i; cout< Nel codice precedente, 'i' può essere visibile all'esterno del file in cui è definito.
D # 32) Spiegare l'identificatore di archiviazione del registro.
Risposta: La variabile 'Register' deve essere utilizzata ogni volta che viene utilizzata la variabile. Quando una variabile viene dichiarata con uno specificatore 'registro', il compilatore fornisce un registro alla CPU per la sua memorizzazione per accelerare la ricerca della variabile.
Q # 33) Quando utilizzare gli argomenti di riferimento 'const' in una funzione?
Risposta: L'utilizzo di argomenti di riferimento 'const' in una funzione è vantaggioso in diversi modi:
- 'Const' protegge da errori di programmazione che potrebbero alterare i dati.
- Come risultato dell'utilizzo di 'const', la funzione è in grado di elaborare argomenti effettivi sia const che non const, il che non è possibile quando non è utilizzato 'const'.
- L'uso di un riferimento const consentirà alla funzione di generare e utilizzare una variabile temporanea in modo appropriato.
Struttura e tipi di dati definiti dall'utente
Q # 34) Cos'è una classe?
Risposta: Class è un tipo di dati definito dall'utente in C ++. Può essere creato per risolvere un particolare tipo di problema. Dopo la creazione, l'utente non è tenuto a conoscere i dettagli del funzionamento di una classe.
In generale, la classe funge da modello di un progetto e può includere in vari parametri e funzioni o azioni che operano su questi parametri. Questi sono chiamati i membri della classe.
D # 35) Differenza tra classe e struttura.
Risposta:
Struttura: Nel linguaggio C, la struttura viene utilizzata per raggruppare insieme diversi tipi di dati. Le variabili all'interno di una struttura sono chiamate i membri della struttura. Questi membri sono pubblici per impostazione predefinita ed è possibile accedervi utilizzando il nome della struttura seguito da un operatore punto e quindi il nome del membro.
Classe: Class è un successore della struttura. C ++ estende la definizione della struttura per includere le funzioni che operano sui suoi membri. Per impostazione predefinita, tutti i membri all'interno della classe sono privati.
Programmazione orientata agli oggetti con C ++
Classi, costruttori, distruttori
D # 36) Cos'è lo spazio dei nomi?
Risposta: Lo spazio dei nomi ci consente di raggruppare un insieme di classi, oggetti e / o funzioni globali sotto un nome specifico.
La forma generale per utilizzare gli spazi dei nomi è:
identificatore dello spazio dei nomi {namespace-body}
Dove identificatore è qualsiasi identificatore valido e il corpo dello spazio dei nomi è l'insieme di classi, oggetti e funzioni inclusi nello spazio dei nomi. Gli spazi dei nomi sono particolarmente utili nel caso in cui sia possibile che più di un oggetto abbia lo stesso nome, con conseguente conflitto di nomi.
Q # 37) Qual è l'uso della dichiarazione 'using'?
Risposta: L'utilizzo della dichiarazione viene utilizzato per fare riferimento a un nome dallo spazio dei nomi senza l'operatore di risoluzione dell'ambito.
D # 38) Cos'è Name Mangling?
Risposta: Il compilatore C ++ codifica i tipi di parametro con funzione / metodo in un nome univoco. Questo processo è chiamato alterazione del nome. Il processo inverso è chiamato districante.
Esempio:
A :: b (int, lungo) const è alterato come 'B__C3Ail' .
Per un costruttore, il nome del metodo viene omesso.
Questo è A :: A (int, lungo) const è alterato come 'C3Ail'.
D # 39) Qual è la differenza tra un oggetto e una classe?
Risposta: La classe è un modello di un progetto o di un problema da risolvere e consiste in variabili e metodi. Questi sono chiamati i membri della classe. Non possiamo accedere ai metodi o alle variabili della classe da soli a meno che non siano dichiarati statici.
Per accedere ai membri della classe e metterli in uso, dobbiamo creare un'istanza di una classe chiamata Object. La classe ha una durata illimitata mentre un oggetto ha solo una durata limitata.
D # 40) Quali sono i vari specificatori di accesso in C ++?
Risposta: C ++ supporta i seguenti specificatori di accesso:
- Pubblico: I membri dei dati e le funzioni sono accessibili all'esterno della classe.
- Privato: I membri dei dati e le funzioni non sono accessibili all'esterno della classe. L'eccezione è l'utilizzo di una classe di amici.
- Protetto: I membri dati e le funzioni sono accessibili solo alle classi derivate.
Esempio:
Descrivi PRIVATO, PROTETTO e PUBBLICO insieme alle loro differenze e fornisci esempi.
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
D # 41) Cos'è un Constructor e come si chiama?
Risposta: Il costruttore è una funzione membro della classe che ha lo stesso nome della classe. Viene utilizzato principalmente per inizializzare i membri della classe. Per impostazione predefinita, i costruttori sono pubblici.
Esistono due modi in cui vengono chiamati i costruttori:
- Implicitamente: I costruttori vengono chiamati implicitamente dal compilatore quando viene creato un oggetto della classe. Questo crea un oggetto su uno Stack.
- Chiamata esplicita: Quando l'oggetto di una classe viene creato utilizzando new, i costruttori vengono chiamati esplicitamente. Questo di solito crea un oggetto su un heap.
Esempio:
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) Cos'è un COPY CONSTRUCTOR e quando viene chiamato?
Risposta: Un costruttore di copia è un costruttore che accetta un oggetto della stessa classe come parametro e copia i suoi membri dati nell'oggetto sulla parte sinistra dell'assegnazione. È utile quando dobbiamo costruire un nuovo oggetto della stessa classe.
Esempio:
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 }
D # 43) Cos'è un costruttore predefinito?
Risposta: Il costruttore predefinito è un costruttore che non ha argomenti o, se ce ne sono, tutti sono argomenti predefiniti.
Esempio:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv[]) { B b; return 0; }
D # 44) Cos'è un Conversion Constructor?
Risposta: È un costruttore che accetta un argomento di un tipo diverso. I costruttori di conversione vengono utilizzati principalmente per la conversione da un tipo a un altro.
D # 45) Che cos'è un costruttore esplicito?
Risposta: Un costruttore di conversione viene dichiarato con la parola chiave esplicita. Il compilatore non usa un costruttore esplicito per implementare una conversione implicita di tipi. Il suo scopo è riservato esplicitamente alla costruzione.
D # 46) Qual è il ruolo della parola chiave Static per una variabile membro di classe?
Risposta: La variabile membro statica condivide una memoria comune tra tutti gli oggetti creati per la rispettiva classe. Non è necessario fare riferimento alla variabile membro statica utilizzando un oggetto. Tuttavia, è possibile accedervi utilizzando il nome della classe stessa.
D # 47) Spiegare la funzione membro statico.
Risposta: Una funzione membro statico può accedere solo alla variabile membro statica della classe. Come le variabili membro statiche, è possibile accedere anche a una funzione membro statico utilizzando il nome della classe.
D # 48) Qual è l'ordine in cui gli oggetti locali vengono distrutti?
Risposta: considera di seguire un pezzo di codice:
Class A{ …. }; int main() { A a; A b; ... }
Nella funzione principale abbiamo due oggetti creati uno dopo l'altro. Vengono creati in ordine, prima a poi b. Ma quando questi oggetti vengono eliminati o se escono dall'ambito, il distruttore di ciascuno verrà chiamato nell'ordine inverso in cui sono stati costruiti.
Quindi, il distruttore di b verrà chiamato per primo seguito da a. Anche se disponiamo di una serie di oggetti, verranno distrutti allo stesso modo nell'ordine inverso rispetto alla loro creazione.
Sovraccarico
D # 49) Spiegare il sovraccarico della funzione e il sovraccarico dell'operatore.
Risposta: C ++ supporta il concetto di OOP Polymorphism che significa 'molte forme'.
In C ++ abbiamo due tipi di polimorfismo, ovvero polimorfismo in fase di compilazione e polimorfismo in fase di esecuzione. Il polimorfismo in fase di compilazione si ottiene utilizzando una tecnica di sovraccarico. Sovraccaricare significa semplicemente dare un significato aggiuntivo a un'entità mantenendo intatto il suo significato di base.
C ++ supporta due tipi di sovraccarico:
Sovraccarico di funzioni:
Il sovraccarico delle funzioni è una tecnica che consente al programmatore di avere più di una funzione con lo stesso nome ma un elenco di parametri diverso. In altre parole, sovraccarichiamo la funzione con argomenti diversi, ad esempio il tipo di argomenti, il numero di argomenti o l'ordine degli argomenti.
Il sovraccarico della funzione non viene mai ottenuto sul tipo restituito.
Sovraccarico dell'operatore:
Questo è ancora un altro tipo di polimorfismo in fase di compilazione supportato da C ++. Nell'overloading degli operatori, un operatore viene sovraccaricato, in modo che possa operare sui tipi definiti dall'utente anche con gli operandi del tipo di dati standard. Ma mentre si fa questo, la definizione standard di quell'operatore viene mantenuta intatta.
Per esempio, un operatore di addizione (+) che opera su tipi di dati numerici può essere sovraccaricato per operare su due oggetti proprio come un oggetto di classe di numeri complessi.
Q # 50) Qual è la differenza tra Overload del metodo e Override del metodo in C ++?
Risposta: Il sovraccarico del metodo consiste nell'avere funzioni con lo stesso nome ma elenchi di argomenti diversi. Questa è una forma di polimorfismo in fase di compilazione.
L'override del metodo viene visualizzato quando riscriviamo il metodo derivato da una classe base. L'override del metodo viene utilizzato durante la gestione del polimorfismo di runtime o delle funzioni virtuali.
D # 51) Qual è la differenza tra un costruttore di copie e un sovraccarico Operatore di assegnazione?
Risposta: Un costruttore di copia e un operatore di assegnazione sovraccaricato hanno fondamentalmente lo stesso scopo, ovvero assegnare il contenuto di un oggetto a un altro. Tuttavia, c'è una differenza tra i due.
Esempio:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
Nell'esempio precedente, la seconda istruzione c1 = c2 è un'istruzione di assegnazione sovraccarica.
Qui, sia c1 che c2 sono già oggetti esistenti e il contenuto di c2 viene assegnato all'oggetto c1. Quindi, per l'istruzione di assegnazione sovraccaricata, entrambi gli oggetti devono essere già creati.
L'istruzione successiva, complessa c3 = c2 è un esempio del costruttore di copie. Qui, il contenuto di c2 viene assegnato a un nuovo oggetto c3, il che significa che il costruttore della copia crea un nuovo oggetto ogni volta che viene eseguito.
Q # 52) Assegna un nome agli operatori che non possono essere sovraccaricati.
Risposta:
- sizeof - operatore sizeof
- . - Operatore punto
- . * - operatore di dereferenziazione
- -> - operatore di dereferenziazione dei membri
- :: - operatore di risoluzione dell'ambito
- ?: - operatore condizionale
Q # 53) La funzione può essere sovraccaricata in base al parametro che è un valore o un riferimento. Spiega se l'affermazione è vera.
Risposta: Falso. Entrambi, Passaggio per valore e Passaggio per riferimento sembrano identici al chiamante.
D # 54) Quali sono i vantaggi del sovraccarico dell'operatore?
Risposta: Sovraccaricando gli operatori standard su una classe, possiamo estendere il significato di questi operatori, in modo che possano operare anche sugli altri oggetti definiti dall'utente.
Il sovraccarico delle funzioni ci consente di ridurre la complessità del codice e renderlo più chiaro e leggibile poiché possiamo avere gli stessi nomi di funzione con elenchi di argomenti diversi.
Eredità
Q # 55) Cos'è l'ereditarietà?
Risposta: L'ereditarietà è un processo mediante il quale possiamo acquisire le caratteristiche di un'entità esistente e formare una nuova entità aggiungendovi più funzionalità.
In termini di C ++, l'ereditarietà consiste nel creare una nuova classe derivandola da una classe esistente in modo che questa nuova classe abbia le proprietà della sua classe genitore oltre che della propria.
Q # 56) Quali sono i vantaggi dell'ereditarietà?
Risposta: L'ereditarietà consente la riutilizzabilità del codice, risparmiando così tempo nello sviluppo del codice.
Ereditando, utilizziamo un software di alta qualità privo di bug che riduce i problemi futuri.
Q # 57) C ++ supporta ereditarietà multilivello e multiple?
Risposta: Sì.
D # 58) Cosa sono le eredità multiple (eredità virtuale)? Quali sono i suoi vantaggi e svantaggi?
Risposta: In più eredità, abbiamo più di una classe base da cui una classe derivata può ereditare. Quindi, una classe derivata accetta le caratteristiche e le proprietà di più di una classe base.
Per esempio , una classe conducente avrà due classi base, vale a dire, dipendente e una persona perché un conducente è un dipendente oltre che una persona. Ciò è vantaggioso perché la classe driver può ereditare le proprietà dell'impiegato e della classe persona.
Ma nel caso di un dipendente e di una persona, la classe avrà alcune proprietà in comune. Tuttavia, si verificherà una situazione ambigua poiché la classe driver non conoscerà le classi da cui dovrebbero essere ereditate le proprietà comuni. Questo è il principale svantaggio delle eredità multiple.
D # 59) Spiega le relazioni di classe ISA e HASA. Come implementeresti ogni?
Risposta: La relazione 'ISA' di solito mostra l'ereditarietà poiché implica che una classe 'ISA' versione specializzata di un'altra classe. Per esempio , Una persona ISA dipendente. Ciò significa che una classe Employee viene ereditata dalla classe Person.
Contrariamente a 'ISA', la relazione 'HASA' descrive che un'entità può avere un'altra entità come suo membro o una classe ha un altro oggetto incorporato al suo interno.
Quindi, prendendo lo stesso esempio di una classe Employee, il modo in cui associamo la classe Salary al dipendente non è ereditandola ma includendo o contenendo l'oggetto Salary all'interno della classe Employee. La relazione 'HASA' si manifesta al meglio con il contenimento o l'aggregazione.
D # 60) Una classe derivata eredita o non eredita?
Risposta: Quando una classe derivata viene costruita da una particolare classe base, sostanzialmente eredita tutte le funzionalità e i membri ordinari della classe base. Ma ci sono alcune eccezioni a questa regola. Ad esempio, una classe derivata non eredita i costruttori e i distruttori della classe base.
Ogni classe ha i propri costruttori e distruttori. La classe derivata inoltre non eredita l'operatore di assegnazione della classe base e gli amici della classe. Il motivo è che queste entità sono specifiche di una particolare classe e se un'altra classe è derivata o se è l'amica di quella classe, non possono essere passate ad esse.
Polimorfismo
D # 61) Cos'è il polimorfismo?
Risposta: L'idea alla base del polimorfismo è in molte forme. In C ++, abbiamo due tipi di polimorfismo:
(i) Polimorfismo in fase di compilazione
Nel polimorfismo in fase di compilazione, otteniamo molte forme sovraccaricando. Quindi, abbiamo un sovraccarico dell'operatore e un sovraccarico della funzione. (Lo abbiamo già trattato sopra)
(ii) Polimorfismo run-time
Questo è il polimorfismo per classi e oggetti. L'idea generale è che una classe base può essere ereditata da più classi. Un puntatore della classe base può puntare alla sua classe figlia e un array della classe base può memorizzare diversi oggetti della classe figlio.
Ciò significa che un oggetto reagisce in modo diverso alla stessa chiamata di funzione. Questo tipo di polimorfismo può utilizzare un meccanismo di funzione virtuale.
D # 62) Cosa sono le funzioni virtuali?
Risposta: Una funzione virtuale consente alle classi derivate di sostituire l'implementazione fornita dalla classe base.
Ogni volta che abbiamo funzioni con lo stesso nome sia nella classe base che in quella derivata, sorge un'ambiguità quando proviamo ad accedere all'oggetto della classe figlia utilizzando un puntatore alla classe base. Poiché stiamo usando un puntatore alla classe base, la funzione che viene chiamata è la funzione della classe base con lo stesso nome.
Per correggere questa ambiguità usiamo la parola chiave “virtual” prima del prototipo di funzione nella classe base. In altre parole, rendiamo questa funzione polimorfica virtuale. Utilizzando una funzione virtuale, possiamo rimuovere l'ambiguità e possiamo accedere correttamente a tutte le funzioni della classe figlia utilizzando un puntatore alla classe base.
D # 63) Fornisci un esempio di polimorfismo run-time / funzioni virtuali.
Risposta:
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; coutNel codice precedente, la classe SHAPE ha una funzione virtuale pura ed è una classe astratta (non può essere istanziata). Ogni classe è derivata da SHAPE che implementa la funzione Draw () a modo suo.
Inoltre, ogni funzione Draw è virtuale in modo che quando usiamo un puntatore di classe base (SHAPE) ogni volta con l'oggetto delle classi derivate (Circle e SQUARE), vengono chiamate le funzioni Draw appropriate.
Q # 64) Cosa intendi per Pure Virtual Functions?
Risposta: Una funzione membro virtuale puro è una funzione membro in cui la classe base impone l'override delle classi derivate. Normalmente questa funzione membro non ha implementazione. Le funzioni virtuali pure sono equiparate a zero.
Esempio:
class Shape { public: virtual void draw() = 0; };
La classe base che ha una funzione virtuale pura come membro può essere definita una 'classe astratta'. Questa classe non può essere istanziata e di solito agisce come un progetto che ha diverse sottoclassi con ulteriore implementazione.
D # 65) Cosa sono i costruttori / distruttori virtuali?
Risposta:
Distruttori virtuali: Quando usiamo un puntatore della classe base che punta a un oggetto della classe derivata e lo usiamo per distruggerlo, invece di chiamare il distruttore della classe derivata, viene chiamato il distruttore della classe base.
Esempio:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Come mostrato nell'esempio precedente, quando diciamo Elimina a, viene chiamato il distruttore ma in realtà è il distruttore della classe base. Ciò genera l'ambiguità che tutta la memoria contenuta in b non verrà cancellata correttamente.
Questo problema può essere risolto utilizzando il concetto di 'Virtual Destructor'.
Quello che facciamo è rendere 'Virtuale' il costruttore della classe base in modo che anche tutti i distruttori della classe figlia diventino virtuali e quando cancelliamo l'oggetto della classe base che punta all'oggetto della classe derivata, viene chiamato il distruttore appropriato e tutto gli oggetti vengono eliminati correttamente.
Questo è mostrato come segue:
conoscenza del dominio sanitario per tester pdf
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Costruttore virtuale : I costruttori non possono essere virtuali. Dichiarare un costruttore come funzione virtuale è un errore di sintassi.
Amico
Q # 66) Cos'è una funzione amico?
Risposta: La classe C ++ non consente l'accesso ai suoi membri privati e protetti al di fuori della classe. Ma questa regola può essere violata facendo uso del ' Amico ' funzione.
Come suggerisce il nome stesso, la funzione amico è una funzione esterna che è un amico della classe. Affinché la funzione amico acceda ai metodi privati e protetti della classe, dovremmo avere un prototipo della funzione amico con la parola chiave 'amico' inclusa all'interno della classe.
Q # 67) Cos'è una lezione di amicizia?
Risposta: Le classi Friend vengono utilizzate quando è necessario sovrascrivere la regola per gli specificatori di accesso privato e protetto in modo che due classi possano lavorare a stretto contatto l'una con l'altra.
Quindi, possiamo avere una classe di amici per essere amici di un'altra classe. In questo modo, le lezioni di amicizia possono mantenere le cose private e inaccessibili così come sono.
Quando abbiamo la necessità di accedere all'implementazione interna di una classe (membro privato) senza esporre i dettagli rendendola pubblica, optiamo per le funzioni di amicizia.
C ++ avanzato
Modelli
Q # 68) Cos'è un modello?
Risposta: I modelli consentono di creare funzioni indipendenti dal tipo di dati (generico) e possono accettare qualsiasi tipo di dati come parametri e restituire valore senza dover sovraccaricare la funzione con tutti i tipi di dati possibili. I modelli soddisfano quasi la funzionalità di una macro.
Il suo prototipo è uno dei seguenti:
modello identificare > function_declaration;
modello identificare > function_declaration;
L'unica differenza tra i due prototipi è l'uso della parola chiave class o typename. La loro funzionalità di base di essere generici rimane la stessa.
La gestione delle eccezioni
D # 69) Che cos'è la gestione delle eccezioni? C ++ supporta la gestione delle eccezioni?
Risposta: Sì, C ++ supporta la gestione delle eccezioni.
Non possiamo garantire che il codice venga eseguito normalmente in ogni momento. Possono verificarsi alcune situazioni che potrebbero forzare il malfunzionamento del codice scritto da noi, anche se è privo di errori. Viene chiamato questo malfunzionamento del codice Eccezione .
Quando si verifica un'eccezione, il compilatore deve lanciarla in modo da sapere che si è verificata un'eccezione. Quando viene generata un'eccezione, il compilatore deve assicurarsi che venga gestita correttamente, in modo che il flusso del programma continui o termini correttamente. Questo è chiamato gestione di un'eccezione.
Quindi in C ++, abbiamo tre parole chiave, ad es. provare , gettare e catturare che sono in gestione delle eccezioni.
La sintassi generale per il blocco delle eccezioni è:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Come mostrato sopra, il codice che potrebbe potenzialmente non funzionare correttamente viene inserito nel blocco try. Quando il codice non funziona correttamente, viene generata un'eccezione. Questa eccezione viene quindi catturata sotto il blocco catch e viene gestita, ovvero viene intrapresa l'azione appropriata.
Q # 70) Commenta le eccezioni standard C ++?
Risposta: C ++ supporta alcune eccezioni standard che possono essere catturate se mettiamo il codice all'interno del blocco try. Queste eccezioni fanno parte della classe base ' std :: eccezione '. Questa classe è definita nel file di intestazione C ++.
Alcuni esempi di eccezioni supportate da questa classe includono:
bad_alloc - lanciato da 'new'
runtime_error - generato per errori di runtime
bad_typeid - lanciato dal tipo id
Introduzione alla libreria di modelli standard
D # 71) Che cos'è una libreria di modelli standard (STL)? Quali sono i vari tipi di container STL?
Risposta: Una libreria di modelli standard (STL) è una libreria di modelli di contenitori approvati dal comitato ANSI per l'inclusione nella specifica C ++ standard. Abbiamo vari tipi di contenitori STL a seconda di come immagazzinano gli elementi.
- Coda, pila - Sono gli stessi della coda e dello stack tradizionali e sono chiamati contenitori adattivi.
- Set, mappa - Questi sono fondamentalmente contenitori che hanno coppie chiave / valore e sono di natura associativa.
- Vector e - Questi sono di natura sequenziale e hanno somiglianze con gli array.
Q # 72) Cos'è una classe Iterator?
Risposta: In C ++ una classe contenitore è una raccolta di oggetti diversi.
Se dobbiamo attraversare questa raccolta di oggetti, non possiamo farlo utilizzando semplici variabili indice. Quindi, abbiamo una classe speciale in STL chiamata an Iteratore classe che può essere utilizzata per scorrere i contenuti della classe contenitore.
Le varie categorie di iteratori includono iteratori di input, iteratori di output, iteratori di inoltro, iteratori bidirezionali, accesso casuale, ecc.
D # 73) Qual è la differenza tra un iteratore esterno e un iteratore interno? Descrivi un vantaggio dell'iteratore esterno.
Risposta: Un iteratore interno viene implementato con le funzioni membro della classe che ha elementi da esaminare.
Un iteratore esterno viene implementato come una classe separata che può essere associata all'oggetto che dispone di elementi da esaminare. Il vantaggio fondamentale di un iteratore esterno è che è facile da implementare poiché è implementato come una classe separata.
In secondo luogo, poiché si tratta di una classe diversa, molti oggetti iteratori possono essere attivi contemporaneamente.
Ulteriore lettura => Domande di intervista C #
Conclusione
Quasi tutti i principali argomenti di codifica e programmazione dell'intervista in C ++ sono trattati in questo articolo.
Ci auguriamo che ogni candidato si senta rilassato dopo essersi preparato per un colloquio utilizzando questa serie di domande.
Tutto il meglio per la tua intervista !!
Lettura consigliata
- Domande e risposte dell'intervista
- ETL Testing Interview Domande e risposte
- Alcune domande e risposte sui test manuali complicati
- 25 migliori domande e risposte per l'intervista al test agile
- Domande dell'intervista di Spock con risposte (le più popolari)
- Alcune interessanti domande di intervista sul test del software
- Top 20+ .NET Intervista Domande e Risposte
- Le 32 migliori domande e risposte per l'intervista di Datastage