top 70 c interview questions
Cele mai frecvente întrebări de bază și avansate pentru interviu C ++ cu exemple de coduri pentru candidații la nivel de intrare, precum și profesioniști cu experiență:
Acest articol detaliat va fi cu siguranță un semn de carte pentru cei care se pregătesc pentru un interviu C ++.
Aproape toate subiectele majore din C ++ sunt tratate aici, împreună cu câteva întrebări de bază despre subiecte avansate, cum ar fi Biblioteca de șabloane standard (STL) etc.
Acest set de întrebări de codare C ++ vă va ajuta să faceți față oricărui interviu C ++ cu încredere și să îl clarificați cu succes la prima încercare.
Ce veți învăța:
- Întrebări de interviu C ++ cu exemple de cod
Întrebări de interviu C ++ cu exemple de cod
Mai jos sunt enumerate cele mai populare întrebări de interviu de programare C ++ la care se răspunde de un expert C ++.
Citește și => Întrebări de top despre programarea C
C ++ de bază
Structura programului C ++
Q # 1) Care este structura de bază a unui program C ++?
Răspuns: Structura de bază a unui program C ++ este prezentată mai jos:
#include int main() { cout<<”Hello,World!”; return 0; }
Prima linie care începe cu „ # ”Este un directivă preprocesator . În acest caz, folosim include ca o directivă care spune compilatorului să includă un antet în timp ce „ iostream.h ”Care va fi folosit pentru intrarea / ieșirea de bază mai târziu în program.
Următoarea linie este funcția „principală” care returnează un număr întreg. Funcția principală este punctul de plecare al execuției pentru orice program C ++. Indiferent de poziția sa în fișierul cod sursă, conținutul funcției principale este întotdeauna executat mai întâi de compilatorul C ++.
În rândul următor, putem vedea acolade deschise care indică începutul unui bloc de cod. După aceasta, vedem instrucțiunea de programare sau linia de cod care folosește numărul care este fluxul de ieșire standard (definiția sa este prezentă în iostream.h).
Acest flux de ieșire ia un șir de caractere și îl tipărește pe un dispozitiv de ieșire standard. În acest caz, este „Bună ziua, lume!”. Vă rugăm să rețineți că fiecare instrucțiune C ++ se încheie cu un punct și virgulă (;), care este foarte necesar și omiterea acesteia va duce la erori de compilare.
Înainte de a închide parantezele}, vedem o altă linie „returnează 0;”. Acesta este punctul de revenire la funcția principală.
Fiecare program C ++ va avea o structură de bază așa cum se arată mai sus, cu o directivă preprocesor, declarația funcției principale urmată de un bloc de cod și apoi un punct de revenire la funcția principală care indică executarea cu succes a programului.
Q # 2) Care sunt comentariile din C ++?
Răspuns: Comentariile în C ++ sunt pur și simplu o bucată de cod sursă ignorat de compilator. Acestea sunt utile doar pentru ca un programator să adauge o descriere sau informații suplimentare despre codul sursă.
În C ++ există două moduri de a adăuga comentarii:
- // comentariu pe o singură linie
- / * blocare comentariu * /
Primul tip va elimina totul după ce compilatorul întâlnește „//”. În cel de-al doilea tip, compilatorul aruncă totul între „/ *” și „* /”.
Variabile, tipuri de date și constante
Q # 3) Diferența dintre declarație și definiția unei variabile.
Răspuns: Declarația unei variabile specifică doar tipul de date al unei variabile și numele variabilei. Ca urmare a declarației, îi spunem compilatorului să rezerve spațiul pentru o variabilă din memorie în funcție de tipul de date specificat.
Exemplu:
int Result; char c; int a,b,c;
Toate cele de mai sus sunt declarații valabile. De asemenea, rețineți că, ca urmare a declarației, valoarea variabilei este nedeterminată.
Întrucât, o definiție este o implementare / instanțiere a variabilei declarate în care legăm valoarea corespunzătoare variabilei declarate, astfel încât linkerul să poată lega referințe la entitățile corespunzătoare.
Din exemplul de mai sus ,
Rezultat = 10;
C = „A”;
Acestea sunt definiții valide.
Q # 4) Comentează domeniul de aplicare local și global al unei variabile.
Răspuns: Domeniul de aplicare al unei variabile este definit ca extinderea codului programului în cadrul căruia variabila rămâne activă, adică poate fi declarată, definită sau folosită.
Există două tipuri de domeniu în C ++:
- Domeniul de aplicare local: Se spune că o variabilă are un scop local sau este locală atunci când este declarată într-un bloc de cod. Variabila rămâne activă numai în interiorul blocului și nu este accesibilă în afara blocului de cod.
- Scop global: O variabilă are un domeniu global atunci când este accesibilă în întregul program. O variabilă globală este declarată deasupra programului înainte de toate definițiile funcției.
Exemplu:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q # 5) Care este prioritatea atunci când există o variabilă globală și o variabilă locală în program cu același nume?
Răspuns: Ori de câte ori există o variabilă locală cu același nume ca și cea a unei variabile globale, compilatorul acordă prioritate variabilei locale.
Exemplu:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Ieșirea codului de mai sus este 5. Acest lucru se datorează faptului că, deși ambele variabile au același nume, compilatorul a acordat preferință domeniului local.
Q # 6) Când există o variabilă globală și o variabilă locală cu același nume, cum veți accesa variabila globală?
Răspuns: Când există două variabile cu același nume, dar domeniu de aplicare diferit, adică una este o variabilă locală și cealaltă este o variabilă globală, compilatorul va da preferință unei variabile locale.
Pentru a accesa variabila globală, folosim un „ operator de rezoluție a domeniului (: :) ”. Folosind acest operator, putem accesa valoarea variabilei globale.
Exemplu:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Ieșire:
Variabila globală x = 10
Variabila locală x = 2
Q # 7) Câte modalități există pentru a inițializa un int cu o constantă?
Răspuns: Există două moduri:
- Primul format folosește notația C tradițională.
int rezultat = 10; - Al doilea format folosește notația constructor.
int rezultatul (10);
Constante
Q # 8) Ce este o constantă? Explicați cu un exemplu.
Răspuns: O constantă este o expresie care are o valoare fixă. Ele pot fi împărțite în constante întregi, zecimale, în virgulă mobilă, caractere sau constante de șiruri, în funcție de tipul lor de date.
În afară de zecimal, C ++ suportă, de asemenea, două constante, adică constante octale (la baza 8) și hexadecimale (la baza 16).
Exemple de constante:
- 75 // întreg (zecimal)
- 0113 // octal
- 0x4b // hexadecimal
- 3.142 // virgulă mobilă
- ‘C’ // constanta caracterului
- „Hello, World” // constantă de șir
Notă: Când trebuie să reprezentăm un singur caracter, folosim ghilimele unice și când dorim să definim o constantă cu mai multe caractere, folosim ghilimele duble.
Q # 9) Cum definiți / declarați constante în C ++?
Răspuns: În C ++, ne putem defini propriile constante folosind #defini directivă preprocesator.
#define Valoare identificator
Exemplu:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Ieșire: Suprafața unui cerc = 78,55
Așa cum se arată în exemplul de mai sus, odată ce definim o constantă folosind directiva #define, o putem folosi pe tot parcursul programului și înlocuim valoarea acesteia.
Putem declara constante în C ++ folosind „ const ”Cuvânt cheie. Acest mod este similar cu cel al declarării unei variabile, dar cu un prefix const.
Exemple de declarare a unei constante
const int pi = 3.142;
const char c = „sth”;
cod poștal const = 411014;
În exemplele de mai sus, ori de câte ori nu este specificat tipul unei constante, compilatorul C ++ îl implică ca tip întreg.
Operatori
Q # 10) Comentariu asupra Operatorului de atribuire în C ++.
Răspuns: Operatorul de atribuire în C ++ este utilizat pentru a atribui o valoare unei alte variabile.
a = 5;
Această linie de cod atribuie valoarea întregului 5 la variabilă la .
Partea din stânga operatorului = este cunoscută sub numele de valoare (valoarea stângă) și dreapta ca valoare (valoare corectă). L valoare trebuie să fie întotdeauna o variabilă în timp ce partea dreaptă poate fi o constantă, o variabilă, rezultatul unei operații sau orice combinație a acestora.
Operațiunea de atribuire are loc întotdeauna de la dreapta la stânga și niciodată invers.
O proprietate pe care C ++ o are față de celelalte limbaje de programare este că operatorul de atribuire poate fi folosit ca valoare (sau o parte a unui valoare ) pentru o altă misiune.
Exemplu:
a = 2 + (b = 5);
este echivalent cu:
b = 5;
a = 2 + b;
Ceea ce înseamnă, mai întâi atribuiți 5 la variabilă b și apoi atribuiți la la, valoarea Două plus rezultatul expresiei anterioare a b (adică 5), frunze la cu o valoare finală de 7 .
Astfel, următoarea expresie este valabilă și în C ++:
a = b = c = 5;
atribuiți 5 variabilelor la , b și c .
Q # 11) Care este diferența dintre egal cu (==) și Operator de atribuire (=)?
Răspuns: În C ++, egal cu (==) și operator de atribuire (=) sunt doi operatori complet diferiți.
Egal cu (==) este un operator relațional de egalitate care evaluează două expresii pentru a vedea dacă sunt egale și returnează adevărat dacă sunt egale și false dacă nu sunt.
Operatorul de atribuire (=) este utilizat pentru a atribui o valoare unei variabile. Prin urmare, putem avea o operațiune de atribuire complexă în cadrul operatorului relațional de egalitate pentru evaluare.
Q # 12) Care sunt diferiții operatori aritmetici în C ++?
Răspuns: C ++ acceptă următorii operatori aritmetici:
- + adăugare
- - scădere
- * multiplicare
- / Divizia
- % modul
Să demonstrăm diferiții operatori aritmetici cu următoarea bucată de cod.
Exemplu:
#include int main () { int a=5, b=3; cout<<”a + b = “< Ieșire :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
După cum se arată mai sus, toate celelalte operații sunt simple și la fel ca operațiunile aritmetice reale, cu excepția operatorului modulo care este destul de diferit. Operatorul Modulo împarte a și b, iar rezultatul operației este restul diviziunii.
Q # 13) Care sunt diferiții operatori de atribuire a compușilor în C ++?
Răspuns: Următoarele sunt operatorii de atribuire compuși în C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
Operatorul de atribuire compus este una dintre cele mai importante caracteristici ale limbajului C ++ care ne permite să schimbăm valoarea unei variabile cu unul dintre operatorii de bază:
Exemplu:
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) Indicați diferența dintre operațiunile de creștere / descreștere pre și post.
Răspuns: C ++ permite doi operatori, adică ++ (increment) și - (decrement), care vă permit să adăugați 1 la valoarea existentă a unei variabile și să scăpați 1 din variabilă respectiv. Acești operatori sunt, la rândul lor, numiți increment (++) și decrement (-).
Exemplu:
a = 5;
a ++;
A doua declarație, a ++, va face ca valoarea 1 să fie adăugată la. Astfel un ++ este echivalent cu
a = a + 1; sau
a + = 1;
O caracteristică unică a acestor operatori este că putem prefixa sau completa acești operatori cu variabila. Prin urmare, dacă a este o variabilă și prefixăm operatorul de creștere, acesta va fi
++ a;
Aceasta se numește Pre-increment. În mod similar, avem și pre-decrement.
Dacă prefixăm variabila a cu un operator de incrementare, vom avea,
a ++;
Acesta este post-increment. La fel, avem și post-decrement.
Diferența dintre semnificația pre și post depinde de modul în care expresia este evaluată și rezultatul este stocat.
În cazul operatorului de pre-creștere / descreștere, operația de creștere / descreștere se efectuează mai întâi și apoi rezultatul este trecut la o valoare. În timp ce pentru operațiile post-increment / descreștere, valoarea este evaluată mai întâi și apoi creșterea / descreșterea se efectuează în consecință.
Exemplu:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-A; # a = 5
b ++; # 6
I / O prin Consolă
Q # 15) Care sunt operatorii de extracție și inserare în C ++? Explicați cu exemple.
Răspuns: În biblioteca iostream.h din C ++, China , și cost sunt cele două fluxuri de date care sunt utilizate pentru intrare și respectiv ieșire. Cout este în mod normal direcționat către ecran, iar cin este atribuit tastaturii.
„Cin” (operator de extracție): Prin utilizarea operatorului supraîncărcat >> cu fluxul cin, C ++ gestionează intrarea standard.
int age; cin>>age;
După cum se arată în exemplul de mai sus, este declarată o variabilă întreagă „vârstă” și apoi așteaptă ca cin (tastatură) să introducă datele. „Cin” procesează intrarea numai când este apăsată tasta RETURN.
„Cout” (operator de inserare): Acesta este utilizat împreună cu supraîncărcarea<< operator. It directs the data that followed it into the cout stream.
Exemplu:
software-ul DVD rip and burn gratuit
cout<<”Hello, World!”; cout<<123;
Structuri și funcții de control
Structuri de control și bucle
Q # 16) Care este diferența dintre bucla while și do while? Explicați cu exemple.
Răspuns: Formatul buclei while în C ++ este:
While (expresie)
{declarații;}
Blocul de instrucțiuni sub while este executat atâta timp cât condiția din expresia dată este adevărată.
Exemplu:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<În codul de mai sus, bucla va ieși direct dacă n este 0. Astfel, în bucla while, condiția de terminare este la începutul buclei și, dacă este îndeplinită, nu se execută nicio iterație a buclei.
Apoi, luăm în considerare bucla do-while.
Formatul general al do-while este:
do {statement;} while (condiție);
Exemplu:
#include int main() { int n; cout<>n; do { cout<În codul de mai sus, putem vedea că instrucțiunea din interiorul buclei este executată cel puțin o dată, deoarece condiția buclei este la sfârșit. Acestea sunt principalele diferențe între timp și timp.
În cazul buclei while, putem ieși direct din buclă la început, dacă condiția nu este îndeplinită, în timp ce în bucla do-while executăm instrucțiunile buclă cel puțin o dată.
Funcții
Q # 17) Ce vrei să spui prin tipul de returnare „nul”?
Răspuns: Toate funcțiile ar trebui să returneze o valoare conform sintaxei generale.
Cu toate acestea, în cazul în care, dacă nu dorim ca o funcție să returneze nicio valoare, vom folosi „ nul ”Pentru a indica asta. Aceasta înseamnă că folosim „ nul ”Pentru a indica faptul că funcția nu are valoare de returnare sau returnează„ nul ”.
Exemplu:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 18) Explicați Pass by Value și Pass by Reference.
Răspuns: În timp ce trecem parametrii funcției folosind „Pass by Value”, trecem o copie a parametrilor către funcție.
Prin urmare, orice modificări aduse parametrilor din funcția apelată nu sunt transmise înapoi la funcția apelantă. Astfel, variabilele din funcția de apelare rămân neschimbate.
Exemplu:
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 = “< Ieșire:
x = 1
y = 3
z = 4
După cum s-a văzut mai sus, deși parametrii au fost modificați în funcția apelată, valorile lor nu au fost reflectate în funcția apelantă, deoarece au fost trecuți de valoare.
Cu toate acestea, dacă dorim să readucem valorile modificate din funcție înapoi la funcția de apelare, atunci folosim tehnica „Treceți prin referință”.
Pentru a demonstra acest lucru, modificăm programul de mai sus după cum urmează:
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 = “< Ieșire:
x = 2
y = 6
z = 8
După cum se arată mai sus, modificările aduse parametrilor din funcțiile apelate sunt transmise funcției apelante atunci când folosim tehnica „Treceți prin referință”. Acest lucru se datorează faptului că folosind această tehnică nu trecem o copie a parametrilor, ci trecem de fapt referința variabilei în sine.
Q # 19) Ce sunt parametrii impliciti? Cum sunt evaluați în funcția C ++?
Răspuns: Parametrul implicit este o valoare care este atribuită fiecărui parametru în timpul declarării unei funcții.
Această valoare este utilizată dacă parametrul respectiv este lăsat necompletat în timp ce apelați la funcție. Pentru a specifica o valoare implicită pentru un anumit parametru, pur și simplu atribuim o valoare parametrului în declarația de funcție.
Dacă valoarea nu este trecută pentru acest parametru în timpul apelului de funcție, atunci compilatorul folosește valoarea implicită furnizată. Dacă este specificată o valoare, atunci această valoare implicită este pășită și se utilizează valoarea trecută.
Exemplu:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Ieșire:
12
6
După cum se arată în codul de mai sus, există două apeluri pentru a multiplica funcția. În primul apel, un singur parametru este trecut cu o valoare. În acest caz, al doilea parametru este valoarea implicită furnizată. Dar în al doilea apel, pe măsură ce ambele valori ale parametrilor sunt trecute, valoarea implicită este anulată și se utilizează valoarea trecută.
Q # 20) Ce este o funcție Inline în C ++?
Răspuns: Funcția Inline este o funcție care este compilată de compilator ca punctul de apelare a funcției și codul este înlocuit în acel punct. Acest lucru face compilarea mai rapidă. Această funcție este definită prin prefixarea prototipului funcției cu cuvântul cheie „inline”.
Astfel de funcții sunt avantajoase numai atunci când codul funcției inline este mic și simplu. Deși o funcție este definită ca Inline, este complet dependentă de compilator să o evalueze ca inline sau nu.
Structura avansată a datelor
Matrice
Q # 21) De ce sunt matricele procesate de obicei cu bucla for?
Răspuns: Array folosește indexul pentru a parcurge fiecare dintre elementele sale.
Dacă A este o matrice, atunci fiecare dintre elementele sale este accesat ca A (i). Programatic, tot ce este necesar pentru ca acest lucru să funcționeze este un bloc iterativ cu o variabilă de buclă i care servește ca un index (contor) care crește de la 0 la A. lungime-1.
Acesta este exact ceea ce face o buclă și acesta este motivul pentru care procesăm matricele folosind bucle.
Q # 22) Indicați diferența dintre ștergere și ștergere ().
Răspuns: „Șterge ()” este folosit pentru a elibera memoria alocată unui tablou care a fost alocat folosind noul (). „Șterge” este folosit pentru a elibera o bucată de memorie care a fost alocată folosind noua.
Q # 23) Ce este în neregulă cu acest cod?
T * p = T nou (10);
șterge p;
Răspuns: Codul de mai sus este corect din punct de vedere sintactic și se va compila bine.
Singura problemă este că va șterge doar primul element al matricei. Deși întreaga matrice este ștearsă, numai distructorul primului element va fi apelat și memoria pentru primul element este eliberată.
Q # 24) Care este ordinea în care sunt distruse obiectele dintr-o matrice?
Răspuns: Obiectele dintr-o matrice sunt distruse în ordinea inversă a construcției: mai întâi construite, ultima distruse.
În exemplul următor, ordinea pentru destructori va fi a (9), a (8), ..., a (1), a (0):
voiduserCode() { Car a(10); ... }
Indicatori
Q # 25) Ce este în neregulă cu acest cod?
T * p = 0;
șterge p;
Răspuns: În codul de mai sus, indicatorul este un indicator nul. Conform standardului C ++ 03, este perfect valid să apelați ștergere pe un pointer NULL. Operatorul de ștergere ar avea grijă de verificarea NULL intern.
Q # 26) Ce este o variabilă de referință în C ++?
Răspuns: O variabilă de referință este un nume de alias pentru variabila existentă. Aceasta înseamnă că atât numele variabilei, cât și variabila de referință indică aceeași locație de memorie. Prin urmare, ori de câte ori variabila este actualizată, și referința este actualizată.
Exemplu:
int a=10; int& b = a;
Aici, b este referința lui a.
Clase de depozitare
Q # 27) Ce este o clasă de stocare? Menționați clasele de stocare în C ++.
Răspuns: Clasa de stocare determină durata de viață sau domeniul de aplicare al simbolurilor, cum ar fi variabila sau funcțiile.
C ++ acceptă următoarele clase de stocare:
- Auto
- Static
- Extern
- Inregistreaza-te
- Mutabil
Q # 28) Explicați specificatorul clasei de stocare mutabilă.
Răspuns: Variabila unui membru al unui obiect de clasă constantă nu poate fi modificată. Cu toate acestea, declarând variabilele ca „modificabile”, putem schimba valorile acestor variabile.
Q # 29) Pentru ce este cuvântul cheie automat?
Răspuns: În mod implicit, fiecare variabilă locală a funcției este automată, adică auto . În funcția de mai jos, atât variabilele „i”, cât și „j” sunt variabile automate.
void f() { int i; auto int j; }
NOTĂ : O variabilă globală nu este o variabilă automată.
Q # 30) Ce este o variabilă statică?
Răspuns: O variabilă statică este o variabilă locală care își păstrează valoarea în cadrul apelurilor funcționale. Variabilele statice sunt declarate folosind cuvântul cheie „static”. Variabilele numerice care sunt statice au valoarea implicită ca zero.
Următoarea funcție va imprima 1 2 3 dacă este apelată de trei ori.
void f() { static int i; ++i; printf(“%d “,i); }
Dacă o variabilă globală este statică, atunci vizibilitatea sa este limitată la același cod sursă.
Î. 31) Care este scopul Specificatorului de stocare externă?
Răspuns: Specificatorul „Extern” este utilizat pentru a rezolva scopul unui simbol global.
#include using nam espace std; main() { extern int i; cout< În codul de mai sus, „i” poate fi vizibil în afara fișierului unde este definit.
Q # 32) Explicați Registrul de stocare.
Răspuns: Variabila „Register” trebuie utilizată ori de câte ori este utilizată variabila. Când o variabilă este declarată cu un specificator „registru”, atunci compilatorul dă registrul procesorului pentru stocarea sa pentru a accelera căutarea variabilei.
Q # 33) Când se utilizează argumentele de referință „const” într-o funcție?
Răspuns: Utilizarea argumentelor de referință „const” într-o funcție este benefică în mai multe moduri:
- „Const” protejează împotriva erorilor de programare care ar putea modifica datele.
- Ca urmare a utilizării „const”, funcția este capabilă să proceseze atât argumente reale const, cât și non-const, ceea ce nu este posibil atunci când „const” nu este utilizat.
- Utilizarea unei referințe const va permite funcției să genereze și să utilizeze o variabilă temporară într-un mod adecvat.
Structură și tipuri de date definite de utilizator
Q # 34) Ce este o clasă?
Răspuns: Clasa este un tip de date definit de utilizator în C ++. Poate fi creat pentru a rezolva un anumit tip de problemă. După creare, utilizatorul nu este obligat să cunoască detaliile despre funcționarea unei clase.
În general, clasa acționează ca un plan al unui proiect și poate include în diverși parametri și funcții sau acțiuni care operează pe acești parametri. Aceștia sunt numiți membri ai clasei.
Q # 35) Diferența dintre clasă și structură.
Răspuns:
Structura: În limbajul C, structura este utilizată pentru a grupa diferite tipuri de tipuri de date împreună. Variabilele din interiorul unei structuri se numesc membri ai structurii. Acești membri sunt publici în mod implicit și pot fi accesați folosind numele structurii urmat de un operator punct și apoi numele de membru.
Clasă: Clasa este un succesor al structurii. C ++ extinde definiția structurii pentru a include funcțiile care operează asupra membrilor săi. În mod implicit, toți membrii din clasă sunt privați.
Programare orientată pe obiecte cu C ++
Clase, constructori, distructori
Î. 36) Ce este spațiul de nume?
Răspuns: Spațiul de nume ne permite să grupăm un set de clase globale, obiecte și / sau funcții sub un anumit nume.
Forma generală de utilizare a spațiilor de nume este:
identificator spațiu de nume {namespace-body}
În cazul în care identificatorul este orice identificator valid și corpul spațiului de nume este setul de clase, obiecte și funcții care sunt incluse în spațiul de nume. Spațiile de nume sunt utile în special în cazul în care există posibilitatea ca mai multe obiecte să aibă același nume, rezultând ciocniri de nume.
Î # 37) La ce folosește declarația „folosind”?
Răspuns: Utilizarea Declarației este utilizată pentru a trimite un nume din spațiul de nume fără operatorul de rezoluție a domeniului.
Q # 38) Ce este Name Mangling?
Răspuns: Compilatorul C ++ codifică tipurile de parametri cu funcție / metodă într-un nume unic. Acest proces se numește denumirea de nume. Procesul invers este numit demangling.
Exemplu:
A :: b (int, lung) const este mangled as „B__C3Ail” .
Pentru un constructor, numele metodei este omis.
Acesta este A :: A (int, lung) const este mangled as „C3Ail”.
Q # 39) Care este diferența dintre un obiect și o clasă?
site-uri web pentru a descărca videoclipuri YouTube pe mp3
Răspuns: Clasa este un plan al unui proiect sau problemă de rezolvat și constă din variabile și metode. Aceștia sunt numiți membri ai clasei. Nu putem accesa singuri metode sau variabile ale clasei decât dacă sunt declarate statice.
Pentru a accesa membrii clasei și a le folosi, ar trebui să creăm o instanță a unei clase care se numește obiect. Clasa are o durată de viață nelimitată, în timp ce un obiect are o durată de viață limitată.
Q # 40) Care sunt diferitele specificații de acces în C ++?
Răspuns: C ++ acceptă următorii specificați de acces:
- Public: Membrii și funcțiile de date sunt accesibile în afara clasei.
- Privat: Membrii și funcțiile de date nu sunt accesibile în afara clasei. Excepția este utilizarea unei clase de prieteni.
- Protejat: Membrii și funcțiile de date sunt accesibile numai claselor derivate.
Exemplu:
Descrieți PRIVAT, PROTEJAT și PUBLIC împreună cu diferențele lor și dați exemple.
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) Ce este un constructor și cum se numește?
Răspuns: Constructor este o funcție membru a clasei care are același nume ca și clasa. Este utilizat în principal pentru inițializarea membrilor clasei. În mod implicit, constructorii sunt publici.
Există două moduri în care constructorii sunt numiți:
- Implicit: Constructorii sunt numiți implicit de compilator atunci când este creat un obiect al clasei. Aceasta creează un obiect pe o stivă.
- Apelare explicită: Când obiectul unei clase este creat folosind noi, constructorii sunt chemați în mod explicit. Acest lucru creează de obicei un obiect pe un Heap.
Exemplu:
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) Ce este un CONSTRUCTOR DE COPII și când se numește?
Răspuns: Un constructor de copiere este un constructor care acceptă un obiect din aceeași clasă ca parametru și își copiază membrii de date în obiectul din partea stângă a atribuirii. Este util atunci când trebuie să construim un nou obiect din aceeași clasă.
Exemplu:
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) Ce este un constructor implicit?
Răspuns: Constructorul implicit este un constructor care fie nu are argumente, fie, dacă există, toate sunt argumente implicite.
Exemplu:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q # 44) Ce este un constructor de conversie?
Răspuns: Este un constructor care acceptă un argument de alt tip. Constructorii de conversie sunt utilizați în principal pentru conversia de la un tip la altul.
Q # 45) Ce este un constructor explicit?
Răspuns: Un constructor de conversie este declarat cu cuvântul cheie explicit. Compilatorul nu folosește un constructor explicit pentru a implementa o conversie implicită de tipuri. Scopul său este rezervat în mod explicit pentru construcții.
Î # 46) Care este rolul cuvântului cheie static pentru o variabilă membru de clasă?
Răspuns: Variabila statică de membru împarte o memorie comună între toate obiectele create pentru clasa respectivă. Nu trebuie să ne referim la variabila statică de membru folosind un obiect. Cu toate acestea, poate fi accesat folosind chiar numele clasei.
Q # 47) Explicați funcția de membru static.
Răspuns: O funcție de membru static poate accesa doar variabila de membru static din clasă. La fel ca și variabilele de membru static, o funcție de membru static poate fi accesată și folosind numele clasei.
Q # 48) Care este ordinea în care sunt distruse obiectele locale?
Răspuns: Luați în considerare urmarea unei bucăți de cod:
Class A{ …. }; int main() { A a; A b; ... }
În funcția principală, avem două obiecte create unul după altul. Ele sunt create în ordine, mai întâi a apoi b. Dar când aceste obiecte sunt șterse sau dacă ies din scop, destructorul pentru fiecare va fi apelat în ordinea inversă în care au fost construite.
Prin urmare, distructorul lui b va fi numit mai întâi urmat de a. Chiar dacă avem o serie de obiecte, acestea vor fi distruse în același mod în ordinea inversă a creației lor.
Suprasolicitare
Q # 49) Explicați supraîncărcarea funcției și supraîncărcarea operatorului.
Răspuns: C ++ acceptă conceptul OOPs Polimorfism care înseamnă „multe forme”.
În C ++ avem două tipuri de polimorfism, adică polimorfism în timp de compilare și polimorfism în timp de rulare. Polimorfismul în timp de compilare se realizează utilizând o tehnică de supraîncărcare. Supraîncărcarea înseamnă pur și simplu acordarea unui sens suplimentar unei entități prin păstrarea intactă a sensului său de bază.
C ++ acceptă două tipuri de supraîncărcare:
Funcția supraîncărcare:
Supraîncărcarea funcției este o tehnică care permite programatorului să aibă mai multe funcții cu același nume, dar listă de parametri diferiți. Cu alte cuvinte, supraîncărcăm funcția cu argumente diferite, adică fie tipul de argumente, numărul de argumente sau ordinea argumentelor.
Supraîncărcarea funcției nu se realizează niciodată la tipul său de retur.
Suprasolicitarea operatorului:
Acesta este încă un alt tip de polimorfism în timp de compilare care este susținut de C ++. În supraîncărcarea operatorului, un operator este supraîncărcat, astfel încât să poată opera pe tipurile definite de utilizator și cu operanzii tipului de date standard. Dar, în timp ce faceți acest lucru, definiția standard a acelui operator este păstrată intactă.
De exemplu, un operator de adiție (+) care operează pe tipuri de date numerice poate fi suprasolicitat pentru a opera pe două obiecte la fel ca un obiect de clasă de număr complex.
Q # 50) Care este diferența dintre supraîncărcarea metodei și suprascrierea metodei în C ++?
Răspuns: Supraîncărcarea metodelor are funcții cu același nume, dar liste de argumente diferite. Aceasta este o formă de polimorfism în timp de compilare.
Anularea metodei apare în imagine atunci când rescriem metoda derivată dintr-o clasă de bază. Înlocuirea metodei este utilizată în timp ce se ocupă de polimorfismul de execuție sau funcții virtuale.
Q # 51) Care este diferența dintre un constructor de copiere și un suprasolicitat Operator de misiune?
Răspuns: Un constructor de copiere și un operator de atribuire supraîncărcat îndeplinesc practic același scop, adică atribuirea conținutului unui obiect altuia. Dar totuși, există o diferență între cele două.
Exemplu:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
În exemplul de mai sus, a doua instrucțiune c1 = c2 este o instrucțiune de atribuire supraîncărcată.
Aici, atât c1 cât și c2 sunt deja obiecte existente, iar conținutul lui c2 este atribuit obiectului c1. Prin urmare, pentru instrucțiunea de atribuire supraîncărcată, ambele obiecte trebuie să fie create deja.
Următoarea afirmație, complexul c3 = c2 este un exemplu al constructorului de copiere. Aici, conținutul c2 este atribuit unui nou obiect c3, ceea ce înseamnă că constructorul copiei creează un nou obiect de fiecare dată când se execută.
Q # 52) Numiți operatorii care nu pot fi supraîncărcați.
Răspuns:
- sizeof - operatorul sizeof
- . - Operator punct
- . * - operator de referințare
- -> - operator de dereferențiere membru
- :: - operator de rezoluție a scopului
- ?: - operator condiționat
Q # 53) Funcția poate fi supraîncărcată pe baza parametrului care este o valoare sau o referință. Explicați dacă afirmația este adevărată.
Răspuns: Fals. Ambele, Trecerea după valoare și Trecerea prin referință arată identic cu apelantul.
Î # 54) Care sunt avantajele supraîncărcării operatorului?
Răspuns: Prin supraîncărcarea operatorilor standard pe o clasă, putem extinde semnificația acestor operatori, astfel încât aceștia să poată opera și pe celelalte obiecte definite de utilizator.
Supraîncărcarea funcției ne permite să reducem complexitatea codului și să-l facem mai clar și mai ușor de citit, deoarece putem avea aceleași nume de funcții cu liste de argumente diferite.
Moştenire
Q # 55) Ce este Moștenirea?
Răspuns: Moștenirea este un proces prin care putem dobândi caracteristicile unei entități existente și să formăm o entitate nouă adăugând mai multe caracteristici la aceasta.
În ceea ce privește C ++, moștenirea creează o nouă clasă derivând-o dintr-o clasă existentă, astfel încât această nouă clasă să aibă proprietățile clasei sale părinte, precum și a propriei sale.
Q # 56) Care sunt avantajele moștenirii?
Răspuns: Moștenirea permite reutilizarea codului, economisind astfel timp la dezvoltarea codului.
Prin moștenire, folosim un software de înaltă calitate, fără erori, care reduce problemele viitoare.
Q # 57) C ++ acceptă moștenirile multiple și multiple?
Răspuns: Da.
Q # 58) Ce sunt moștenirile multiple (moștenirea virtuală)? Care sunt avantajele și dezavantajele sale?
Răspuns: În mai multe moșteniri, avem mai multe clase de bază din care poate moșteni o clasă derivată. Prin urmare, o clasă derivată ia caracteristicile și proprietățile mai multor clase de bază.
De exemplu , o clasa conducător auto va avea două clase de bază și anume, angajat și o persoană, deoarece un șofer este atât un angajat, cât și o persoană. Acest lucru este avantajos, deoarece clasa șoferului poate moșteni proprietățile angajatului, precum și clasa de persoană.
Dar în cazul unui angajat și al unei persoane, clasa va avea unele proprietăți în comun. Cu toate acestea, va apărea o situație ambiguă, deoarece clasa de șofer nu va cunoaște clasele din care ar trebui moștenite proprietățile comune. Acesta este dezavantajul major al moștenirilor multiple.
Q # 59) Explicați relațiile de clasă ISA și HASA. Cum ați implementa fiecare?
Răspuns: Relația „ISA” prezintă de obicei moștenire, deoarece implică faptul că o versiune specializată de clasă „ISA” a altei clase. De exemplu , O persoană angajată ISA. Asta înseamnă că o clasă Angajat este moștenită din clasa Persoană.
Spre deosebire de „ISA”, relația „HASA” descrie că o entitate poate avea o altă entitate ca membru sau o clasă are un alt obiect încorporat în ea.
Așadar, luând același exemplu de clasă Angajat, modul în care asociem clasa Salariu cu angajatul nu este prin moștenire, ci prin includerea sau conținerea obiectului Salariu în clasa Angajat. Relația „HASA” este cel mai bine prezentată prin izolare sau agregare.
Q # 60) O clasă derivată moștenește sau nu moștenește?
Răspuns: Când o clasă derivată este construită dintr-o anumită clasă de bază, aceasta moștenește practic toate caracteristicile și membrii obișnuiți ai clasei de bază. Dar există câteva excepții de la această regulă. De exemplu, o clasă derivată nu moștenește constructorii și distructorii clasei de bază.
Fiecare clasă are proprii constructori și destructori. De asemenea, clasa derivată nu moștenește operatorul de atribuire al clasei de bază și prietenii clasei. Motivul este că aceste entități sunt specifice unei anumite clase și dacă este derivată o altă clasă sau dacă este prietenul clasei respective, atunci ele nu pot fi transmise asupra lor.
Polimorfism
Q # 61) Ce este polimorfismul?
Răspuns: Ideea de bază din spatele polimorfismului este în multe forme. În C ++, avem două tipuri de polimorfism:
(i) Polimorfism în timp de compilare
În polimorfismul de compilare, obținem multe forme prin supraîncărcare. Prin urmare, avem o supraîncărcare a operatorului și o supraîncărcare a funcției. (Am acoperit deja acest aspect mai sus)
(ii) Polimorfism în timpul rulării
Acesta este polimorfismul pentru clase și obiecte. Ideea generală este că o clasă de bază poate fi moștenită de mai multe clase. Un pointer de clasă de bază poate indica clasa sa copil și o matrice de clasă de bază poate stoca diferite obiecte de clasă copil.
Aceasta înseamnă că un obiect reacționează diferit la același apel funcțional. Acest tip de polimorfism poate utiliza un mecanism funcțional virtual.
Q # 62) Ce sunt funcțiile virtuale?
Răspuns: O funcție virtuală permite claselor derivate să înlocuiască implementarea oferită de clasa de bază.
Ori de câte ori avem funcții cu același nume atât în clasa de bază, cât și în clasa derivată, apare o ambiguitate atunci când încercăm să accesăm obiectul clasei copil folosind un pointer de clasă de bază. Deoarece folosim un pointer de clasă de bază, funcția care se numește este funcția de clasă de bază cu același nume.
Pentru a corecta această ambiguitate, folosim cuvântul cheie „virtual” înainte de prototipul funcției din clasa de bază. Cu alte cuvinte, facem această funcție polimorfă virtuală. Folosind o funcție Virtuală, putem elimina ambiguitatea și putem accesa corect toate funcțiile clasei copil folosind un pointer de clasă de bază.
Q # 63) Dați un exemplu de polimorfism în funcțiune / funcții virtuale.
Răspuns:
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; coutÎn codul de mai sus, clasa SHAPE are o funcție virtuală pură și este o clasă abstractă (nu poate fi instanțiată). Fiecare clasă este derivată din SHAPE implementând funcția Draw () în felul său.
În plus, fiecare funcție Draw este virtuală, astfel încât atunci când folosim un pointer de clasă de bază (SHAPE) de fiecare dată cu obiectul claselor derivate (Circle și SQUARE), atunci sunt apelate funcțiile Draw adecvate.
Q # 64) Ce vrei să spui prin funcții virtuale pure?
Răspuns: O funcție de membru virtual pur este o funcție de membru în care clasa de bază forțează clasele derivate să suprascrie. În mod normal, această funcție membru nu are nicio implementare. Funcțiile virtuale pure sunt echivalate cu zero.
Exemplu:
class Shape { public: virtual void draw() = 0; };
Clasa de bază care are o funcție virtuală pură ca membru poate fi denumită „clasă abstractă”. Această clasă nu poate fi instanțiată și acționează de obicei ca un plan care are mai multe sub-clase cu implementare ulterioară.
Q # 65) Ce sunt constructorii / distrugătorii virtuali?
Răspuns:
Destructori virtuali: Când folosim un pointer de clasă de bază care indică un obiect de clasă derivat și îl folosim pentru a-l distruge, atunci în loc să apelăm distructorul clasei derivate, se numește distructorul clasei de bază.
Exemplu:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Așa cum se arată în exemplul de mai sus, când spunem ștergeți a, se numește distructorul, dar este de fapt distructorul clasei de bază. Acest lucru dă naștere la ambiguitatea că toată memoria deținută de b nu va fi curățată corect.
Această problemă poate fi rezolvată prin utilizarea conceptului „Virtual Destructor”.
Ceea ce facem este să facem constructorul clasei de bază „Virtual” astfel încât toți destructorii clasei copil să devină virtuali și atunci când ștergem obiectul clasei de bază care indică obiectul clasei derivate, se numește distructorul corespunzător și toate obiectele sunt șterse corect.
Aceasta este prezentată după cum urmează:
cu ce să deschideți fișiere swf
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Constructor virtual : Constructorii nu pot fi virtuali. Declararea unui constructor ca funcție virtuală este o eroare de sintaxă.
Prieten
Q # 66) Ce este o funcție de prieten?
Răspuns: Clasa C ++ nu permite accesul membrilor săi privați și privați în afara clasei. Dar această regulă poate fi încălcată folosind „ Prieten ”Funcție.
După cum sugerează și numele, funcția de prieten este o funcție externă care este un prieten al clasei. Pentru ca funcția prieten să acceseze metodele private și protejate ale clasei, ar trebui să avem un prototip al funcției prieten cu cuvântul cheie „prieten” inclus în clasă.
Q # 67) Ce este o clasă de prieteni?
Răspuns: Clasele de prieteni sunt folosite atunci când trebuie să înlocuim regula pentru specificatorii de acces privat și protejat, astfel încât două clase să poată lucra îndeaproape unul cu celălalt.
Prin urmare, putem avea o clasă de prieteni pentru a fi prietenul unei alte clase. În acest fel, clasele de prieteni pot păstra lucrurile private și inaccesibile în modul în care sunt.
Când avem cerința de a accesa implementarea internă a unei clase (membru privat) fără a expune detaliile făcând public, mergem pentru funcții de prietenie.
Advanced C ++
Șabloane
Q # 68) Ce este un șablon?
Răspuns: Șabloanele permit crearea de funcții care sunt independente de tipul de date (generic) și pot lua orice tip de date ca parametri și returnează valoarea fără a fi nevoie să supraîncărcați funcția cu toate tipurile de date posibile. Șabloanele aproape îndeplinesc funcționalitatea unui macro.
Prototipul său este oricare dintre următoarele:
șablon identifica > declarație_funcție;
șablon identifica > declarație_funcție;
Singura diferență dintre ambele prototipuri este utilizarea clasei de cuvinte cheie sau typename. Funcționalitatea lor de bază de a fi generică rămâne aceeași.
Manevrarea excepțiilor
Q # 69) Ce este gestionarea excepțiilor? C ++ acceptă gestionarea excepțiilor?
Răspuns: Da, C ++ acceptă gestionarea excepțiilor.
Nu ne putem asigura că codul se va executa normal în orice moment. Pot exista anumite situații care ar putea obliga codul scris de noi să funcționeze defectuos, chiar dacă nu conține erori. Această defecțiune a codului este numită Excepție .
Când a avut loc o excepție, compilatorul trebuie să o arunce astfel încât să știm că a avut loc o excepție. Când a fost aruncată o excepție, compilatorul trebuie să se asigure că este tratat corect, astfel încât fluxul programului să continue sau să se încheie corect. Aceasta se numește tratarea unei excepții.
Astfel, în C ++, avem trei cuvinte cheie, adică încerca , arunca și captură care se ocupă de excepții.
Sintaxa generală pentru blocul de excepție este:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Așa cum se arată mai sus, codul care ar putea să funcționeze defectuos este pus sub blocul try. Atunci când codul funcționează defectuos, se lansează o excepție. Această excepție este apoi prinsă sub blocul de captură și este gestionată, adică se iau măsurile corespunzătoare.
Q # 70) Comentează excepțiile standard C ++?
Răspuns: C ++ acceptă câteva excepții standard care pot fi surprinse dacă introducem codul în blocul try. Aceste excepții fac parte din clasa de bază „ std :: excepție ”. Această clasă este definită în fișierul antet C ++.
Câteva exemple de excepții acceptate de această clasă includ:
bad_alloc - aruncat de „nou”
runtime_error - aruncat pentru erori de runtime
bad_typeid - aruncat după tipul id
Introducere în Biblioteca de șabloane standard
Q # 71) Ce este o bibliotecă de șabloane standard (STL)? Care sunt diferitele tipuri de containere STL?
Răspuns: O bibliotecă de șabloane standard (STL) este o bibliotecă de șabloane de containere aprobate de comitetul ANSI pentru includere în specificația standard C ++. Avem diferite tipuri de containere STL în funcție de modul în care depozitează elementele.
- Coadă, stivă - Acestea sunt identice cu coada și stiva tradiționale și se numesc containere adaptive.
- Set, Hartă - Acestea sunt practic containere care au perechi cheie / valoare și sunt de natură asociativă.
- Vector și - Acestea sunt de natură secvențială și au similitudini cu tablourile.
Q # 72) Ce este o clasă Iterator?
Răspuns: În C ++, o clasă container este o colecție de obiecte diferite.
Dacă trebuie să parcurgem această colecție de obiecte, nu o putem face folosind variabile index simple. Prin urmare, avem o clasă specială în STL numită an Iterator clasă care poate fi utilizată pentru a parcurge conținutul clasei de containere.
Diferitele categorii de iteratori includ iteratori de intrare, iteratori de ieșire, iteratori forward, iteratori bidirecționali, acces aleatoriu etc.
Q # 73) Care este diferența dintre un Iterator extern și un Iterator intern? Descrieți un avantaj al Iteratorului extern.
Răspuns: Un iterator intern este implementat cu funcții membre ale clasei care are elemente de parcurs.
Un iterator extern este implementat ca o clasă separată care poate fi legată de obiectul care are elemente de parcurs. Avantajul de bază al unui iterator extern este că este ușor de implementat, deoarece este implementat ca o clasă separată.
În al doilea rând, deoarece este o clasă diferită, multe obiecte iteratoare pot fi active simultan.
Lecturi suplimentare => C # Întrebări de interviu
Concluzie
Aproape toate subiectele majore de codificare și programare ale interviului C ++ sunt tratate în acest articol.
Sperăm că orice candidat se va simți relaxat după pregătirea pentru un interviu folosind această serie de întrebări de interviu.
Toate cele bune pentru interviu!
Lectură recomandată
- Întrebări și răspunsuri la interviu
- Întrebări și răspunsuri la interviuri de testare ETL
- Câteva întrebări și răspunsuri dificile de testare manuală
- Cele mai bune 25 de întrebări și răspunsuri de interviu pentru testarea agilă
- Întrebări de interviu cu răspunsuri Spock (Cele mai populare)
- Câteva întrebări interesante despre testarea software-ului
- Top 20+ Întrebări și răspunsuri la interviu .NET
- Top 32 Cele mai bune întrebări și răspunsuri pentru interviul Datastage