top 70 c interview questions
Preguntes bàsiques i avançades d’entrevistes C ++ bàsiques i avançades amb exemples de codis per a candidats d’entrada i professionals experimentats:
Aquest detallat article segurament serà un marcador per a aquells que es preparen per a una entrevista en C ++.
Aquí es tracten gairebé tots els temes principals de C ++ juntament amb algunes preguntes bàsiques sobre temes avançats, com ara Biblioteca de plantilles estàndard (STL), etc.
Aquest conjunt de preguntes sobre codificació C ++ us ajudarà a afrontar qualsevol entrevista C ++ amb confiança i a esborrar-la amb èxit al primer intent.
Què aprendreu:
- Preguntes d’entrevistes C ++ amb exemples de codi
Preguntes d’entrevistes C ++ amb exemples de codi
A continuació, es detallen les preguntes d’entrevistes de programació C ++ més populars que respon un expert en C ++.
Llegiu també => Preguntes principals sobre l'entrevista de programació C
C ++ bàsic
Estructura del programa C ++
Q # 1) Quina és l'estructura bàsica d'un programa C ++?
Resposta: A continuació es mostra l’estructura bàsica d’un programa C ++:
#include int main() { cout<<”Hello,World!”; return 0; }
La primera línia que comença per ' # ' és un directiva de preprocessador . En aquest cas, ho fem servir incloure com una directiva que indica al compilador que inclogui una capçalera mentre ' iostream.h 'Que s'utilitzarà per a l'entrada / sortida bàsica més endavant al programa.
La següent línia és la funció 'principal' que retorna un nombre enter. La funció principal és el punt d’execució de qualsevol programa C ++. Independentment de la seva posició al fitxer de codi font, el compilador C ++ sempre executa primer el contingut de la funció principal.
A la següent línia, podem veure claus obertes que indiquen l’inici d’un bloc de codi. Després d'això, veiem la instrucció de programació o la línia de codi que utilitza el recompte que és el flux de sortida estàndard (la seva definició és present a iostream.h).
Aquest flux de sortida pren una cadena de caràcters i l’imprimeix en un dispositiu de sortida estàndard. En aquest cas, es tracta de 'Hola, món!'. Tingueu en compte que cada instrucció C ++ acaba amb un punt i coma (;), que és molt necessari i, si l’ometeu, es produiran errors de compilació.
Abans de tancar els claudàtors}, veiem una altra línia 'return 0;'. Aquest és el punt de retorn a la funció principal.
Cada programa C ++ tindrà una estructura bàsica com es mostra anteriorment amb una directiva de preprocessador, declaració de funció principal seguida d'un bloc de codi i, a continuació, un punt de retorn a la funció principal que indica l'execució del programa amb èxit.
Q # 2) Quins són els comentaris a C ++?
Resposta: Els comentaris en C ++ són simplement un fragment de codi font ignorat pel compilador. Només són útils per a un programador per afegir una descripció o informació addicional sobre el seu codi font.
A C ++ hi ha dues maneres d'afegir comentaris:
- // comentari d'una sola línia
- / * bloqueja el comentari * /
El primer tipus ho descartarà tot després que el compilador trobi “//”. En el segon tipus, el compilador descarta tot entre '/ *' i '* /'.
Variables, tipus de dades i constants
Q # 3) Diferència entre declaració i definició d'una variable.
Resposta: La declaració d'una variable només especifica el tipus de dades d'una variable i el nom de la variable. Com a resultat de la declaració, li diem al compilador que reservi l'espai per a una variable a la memòria segons el tipus de dades especificat.
Exemple:
int Result; char c; int a,b,c;
Totes les declaracions anteriors són vàlides. Tingueu en compte també que, com a resultat de la declaració, el valor de la variable no està determinat.
Mentre que, una definició és una implementació / instanciació de la variable declarada en què lliguem el valor adequat a la variable declarada perquè l'enllaçador pugui enllaçar referències a les entitats adequades.
Des de l'exemple anterior ,
Resultat = 10;
C = ‘A’;
Són definicions vàlides.
Q # 4) Comenteu l'abast local i global d'una variable.
Resposta: L’abast d’una variable es defineix com l’extensió del codi del programa dins del qual la variable roman activa, és a dir, es pot declarar, definir o treballar.
Hi ha dos tipus d’abast a C ++:
- Àmbit local: Es diu que una variable té un abast local o és local quan es declara dins d’un bloc de codi. La variable roman activa només dins del bloc i no és accessible fora del bloc de codi.
- Abast global: Una variable té un abast global quan és accessible a tot el programa. Una variable global es declara a la part superior del programa abans de totes les definicions de funcions.
Exemple:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q # 5) Quina és la precedència quan hi ha una variable global i una variable local al programa amb el mateix nom?
Resposta: Sempre que hi ha una variable local amb el mateix nom que el d’una variable global, el compilador dóna prioritat a la variable local.
Exemple:
#include int globalVar = 2; int main() { int globalVar = 5; cout<La sortida del codi anterior és 5. Això es deu al fet que, tot i que les dues variables tenen el mateix nom, el compilador ha donat preferència a l’abast local.
P # 6) Quan hi ha una variable global i una variable local amb el mateix nom, com accedireu a la variable global?
Resposta: Quan hi ha dues variables amb el mateix nom però abast diferent, és a dir, una és una variable local i l’altra és una variable global, el compilador donarà preferència a una variable local.
Per accedir a la variable global, fem servir un “ operador de resolució d'abast (: :) ”. Mitjançant aquest operador, podem accedir al valor de la variable global.
Exemple:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Sortida:
Variable global x = 10
Variable local x = 2
Q # 7) Quantes maneres hi ha d'inicialitzar una int amb una constant?
Resposta: Hi ha dues maneres:
- El primer format utilitza la notació C tradicional.
int result = 10; - El segon format utilitza la notació constructora.
int result (10);
Constants
Q # 8) Què és una constant? Expliqueu-ho amb un exemple.
Resposta: Una constant és una expressió que té un valor fix. Es poden dividir en constants enters, decimals, de coma flotant, caràcters o cadenes segons el seu tipus de dades.
A part del decimal, C ++ també admet dues constants més, és a dir, constants octal (fins a la base 8) i hexadecimal (fins a la base 16).
Exemples de constants:
- 75 // enter (decimal)
- 0113 // octal
- 0x4b // hexadecimal
- 3.142 // punt flotant
- ‘C’ // constant de caràcters
- 'Hola, món' // constant de la cadena
Nota: Quan hem de representar un sol caràcter, fem servir cometes simples i quan volem definir una constant amb més d’un caràcter, fem servir cometes dobles.
P # 9) Com es defineixen / es declaren constants a C ++?
Resposta: A C ++, podem definir les nostres pròpies constants mitjançant #define directiva de preprocessador.
#define Valor identificador
Exemple:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Sortida: Àrea d’un cercle = 78,55
Com es mostra a l'exemple anterior, una vegada que definim una constant mitjançant la directiva #define, la podem utilitzar a tot el programa i substituir-ne el valor.
Podem declarar constants en C ++ mitjançant el símbol “ const ”Paraula clau. Aquesta manera és similar a la de declarar una variable, però amb un prefix const.
Exemples de declaració d'una constant
const int pi = 3,142;
const char c = 'sth';
const postal = 411014;
En els exemples anteriors, sempre que no s'especifica el tipus d'una constant, el compilador C ++ el defineix per defecte com a tipus enter.
Operadors
Q # 10) Comentari sobre l'operador d'assignació en C ++.
Resposta: L'operador d'assignació a C ++ s'utilitza per assignar un valor a una altra variable.
a = 5;
Aquesta línia de codi assigna el valor enter 5 a variable a .
La part a l'esquerra de l'operador = es coneix com a valor (valor esquerre) i la dreta com valor (valor correcte). L valor ha de ser sempre una variable mentre que el costat dret pot ser una constant, una variable, el resultat d'una operació o qualsevol combinació d'elles.
L’operació d’assignació sempre té lloc de dreta a esquerra i mai a la inversa.
Una propietat que té C ++ sobre els altres llenguatges de programació és que l'operador d'assignació es pot utilitzar com a valor (o part d 'un fitxer valor ) per a una altra tasca.
Exemple:
a = 2 + (b = 5);
equival a:
b = 5;
a = 2 + b;
El que significa, primer assignar 5 a variable b i després assignar a a, el valor 2 més el resultat de l'expressió anterior de b (és a dir, 5), fulles a amb un valor final de 7 .
Per tant, la següent expressió també és vàlida a C ++:
a = b = c = 5;
assigneu 5 a variables a , b i c .
Q # 11) Quina diferència hi ha entre igual a (==) i Operador d'assignació (=)?
Resposta: A C ++, igual a (==) i operador d'assignació (=) són dos operadors completament diferents.
Igual a (==) és un operador relacional d’igualtat que avalua dues expressions per veure si són iguals i retorna cert si són iguals i fals si no ho són.
L'operador d'assignació (=) s'utilitza per assignar un valor a una variable. Per tant, podem tenir una operació d’assignació complexa dins de l’operador relacional d’igualtat per a la seva avaluació.
P # 12) Quins són els diversos operadors aritmètics de C ++?
Resposta: C ++ admet els operadors aritmètics següents:
- + addició
- - resta
- * multiplicació
- / divisió
- % mòdul
Demostrem els diversos operadors aritmètics amb el següent tros de codi.
Exemple:
#include int main () { int a=5, b=3; cout<<”a + b = “< Sortida :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Com es mostra més amunt, totes les altres operacions són senzilles i iguals que les operacions aritmètiques reals, excepte l'operador de mòdul que és bastant diferent. L'operador de mòdul divideix a i b i el resultat de l'operació és la resta de la divisió.
P # 13) Quins són els diversos operadors d'assignació de compostos en C ++?
Resposta: A continuació es detallen els operadors d’assignació de compostos en C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
L'operador d'assignació compost és una de les característiques més importants del llenguatge C ++ que ens permet canviar el valor d'una variable amb un dels operadors bàsics:
Exemple:
value += increase; is equivalent to value = value + increase; if base_salary is a variable of type int. int base_salary = 1000; base_salary += 1000; #base_salary = base_salary + 1000 base_salary *= 5; #base_salary = base_salary * 5;
Q # 14) Indiqueu la diferència entre les operacions d’increment / disminució anteriors i posteriors.
Resposta: C ++ permet dos operadors, és a dir, ++ (increment) i - (decrement), que permeten afegir 1 al valor existent d'una variable i restar 1 de la variable respectivament. Aquests operadors, al seu torn, s’anomenen increment (++) i decrement (-).
Exemple:
a = 5;
a ++;
La segona sentència, a ++, farà que s’afegeixi 1 al valor de. Per tant, un ++ equival a
a = a + 1; o bé
a + = 1;
Una característica única d’aquests operadors és que podem prefixar o sufixar aquests operadors amb la variable. Per tant, si a és una variable i prefixem l’operador d’increment, serà
++ a;
Això s’anomena preincrement. De la mateixa manera, també tenim predecrement.
Si prefixem la variable a amb un operador d’increment, tindrem,
a ++;
Aquest és el postincrement. De la mateixa manera, també tenim postdecrement.
La diferència entre el significat de pre i post depèn de com s’avalua l’expressió i s’emmagatzema el resultat.
En el cas de l’operador de preincrement / decrement, primer es realitza l’operació d’increment / decrement i després el resultat passa a un valor. Mentre que per a les operacions postincrement / decrement, primer s’avalua el valor i després es realitza l’increment / decrement en conseqüència.
Exemple:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
–A; # a = 5
b ++; # 6
E / S a través de la consola
P # 15) Quins són els operadors d’extracció i inserció a C ++? Expliqueu-ho amb exemples.
Resposta: A la biblioteca iostream.h de C ++, Xina , i cost són els dos fluxos de dades que s'utilitzen per a l'entrada i sortida respectivament. Normalment, Cout es dirigeix a la pantalla i cin s’assigna al teclat.
'Cin' (operador d'extracció): En utilitzar un operador sobrecarregat >> amb cin stream, C ++ gestiona l'entrada estàndard.
int age; cin>>age;
Com es mostra a l’exemple anterior, es declara una variable sencera ‘age’ i, a continuació, espera que cin (teclat) introdueixi les dades. 'Cin' només processa l'entrada quan es prem la tecla RETURN.
'Cout' (operador d'inserció): S'utilitza juntament amb la sobrecàrrega<< operator. It directs the data that followed it into the cout stream.
Exemple:
el millor convertidor de fitxers gratuït per a Windows 10
cout<<”Hello, World!”; cout<<123;
Estructures i funcions de control
Estructures i bucles de control
P # 16) Quina diferència hi ha entre bucle while i do while? Expliqueu-ho amb exemples.
Resposta: El format del bucle while a C ++ és:
While (expressió)
{declaracions;}
El bloc d’instruccions sota mentre s’executa sempre que la condició de l’expressió donada sigui certa.
Exemple:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<Al codi anterior, el bucle sortirà directament si n és 0. Així, al bucle while, la condició de finalització es troba al principi del bucle i, si es compleix, no s’executen iteracions del bucle.
A continuació, considerem el bucle do-while.
El format general de do-while és:
fer {sentència;} mentre que (condició);
Exemple:
#include int main() { int n; cout<>n; do { cout<Al codi anterior, podem veure que la sentència dins del bucle s’executa almenys una vegada, ja que la condició del bucle és al final. Aquestes són les principals diferències entre el temps i el temps.
En el cas del bucle while, podem sortir directament del bucle al principi, si la condició no es compleix mentre que al bucle do-while executem les sentències loop almenys una vegada.
Funcions
P # 17) Què voleu dir amb tipus de retorn 'nul'?
Resposta: Totes les funcions haurien de retornar un valor segons la sintaxi general.
preguntes i respostes de l'entrevista de desenvolupadors nets
Tanmateix, en el cas que si no volem que una funció torni cap valor, fem servir ' buit ”Per indicar-ho. Això significa que fem servir ' buit 'Per indicar que la funció no té cap valor de retorn o que torna' buit '.
Exemple:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
P # 18) Expliqueu Pass per valor i Pass per referència.
Resposta: Mentre passem paràmetres a la funció mitjançant 'Passa per valor', passem una còpia dels paràmetres a la funció.
Per tant, qualsevol modificació que es faci als paràmetres de la funció cridada no es torna a la funció de trucada. Per tant, les variables de la funció de trucada es mantenen sense canvis.
Exemple:
void printFunc(int a,int b,int c) { a *=2; b *=2; c *=2; } int main() { int x = 1,y=3,z=4; printFunc(x,y,z); cout<<”x = “< Sortida:
x = 1
i = 3
z = 4
Com es va veure més amunt, tot i que els paràmetres es van canviar a la funció anomenada, els seus valors no es van reflectir a la funció de trucada ja que es van passar pel valor.
Tanmateix, si volem recuperar els valors modificats de la funció a la funció de trucada, fem servir la tècnica 'Passa per referència'.
Per demostrar-ho, modifiquem el programa anterior de la següent manera:
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 = “< Sortida:
x = 2
i = 6
z = 8
Com es mostra més amunt, les modificacions fetes als paràmetres de les funcions cridades es passen a la funció de trucada quan fem servir la tècnica 'Passa per referència'. Això es deu al fet que mitjançant aquesta tècnica no passem una còpia dels paràmetres, sinó que passem la referència de la variable mateixa.
P # 19) Què són els paràmetres predeterminats? Com s’avaluen a la funció C ++?
Resposta: El paràmetre per defecte és un valor que s'assigna a cada paràmetre mentre es declara una funció.
Aquest valor s'utilitza si aquest paràmetre es deixa en blanc mentre es crida a la funció. Per especificar un valor per defecte per a un paràmetre concret, simplement assignem un valor al paràmetre a la declaració de funció.
Si no es passa el valor d'aquest paràmetre durant la trucada de funció, el compilador utilitza el valor predeterminat proporcionat. Si s’especifica un valor, es trepitja aquest valor per defecte i s’utilitza el valor passat.
Exemple:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Sortida:
12
6
Com es mostra al codi anterior, hi ha dues trucades per multiplicar la funció. A la primera trucada, només es passa un paràmetre amb un valor. En aquest cas, el segon paràmetre és el valor predeterminat proporcionat. Però a la segona trucada, a mesura que es passen els dos valors dels paràmetres, el valor per defecte s’anul·la i s’utilitza el valor passat.
P # 20) Què és una funció Inline a C ++?
Resposta: La funció en línia és una funció que el compilador compila com a punt de cridar la funció i el codi se substitueix en aquest punt. Això fa que la compilació sigui més ràpida. Aquesta funció es defineix prefixant el prototip de funció amb la paraula clau 'inline'.
Aquestes funcions només són avantatjoses quan el codi de la funció en línia és petit i senzill. Tot i que una funció es defineix com a Inline, depèn completament del compilador avaluar-la com a inline o no.
Estructura de dades avançades
Matrius
P # 21) Per què es solen processar matrius amb for loop?
Resposta: Array utilitza l'índex per recórrer cadascun dels seus elements.
Si A és una matriu, s'accedeix a cadascun dels seus elements com a A [i]. Programàticament, tot el que es requereix perquè funcioni és un bloc iteratiu amb una variable de bucle i que serveix com a índex (comptador) que augmenta de 0 a A. longitud-1.
Això és exactament el que fa un bucle i aquest és el motiu pel qual processem matrius utilitzant per a bucles.
Q # 22) Indiqueu la diferència entre eliminar i eliminar [].
Resposta: 'Esborrar []' s'utilitza per alliberar la memòria assignada a una matriu que es va assignar mitjançant un nou []. 'Esborrar' s'utilitza per alliberar un tros de memòria que es va assignar usant nou.
P # 23) Què passa amb aquest codi?
T * p = T nova [10];
esborra p;
Resposta: El codi anterior és sintàcticament correcte i es compilarà bé.
L'únic problema és que només eliminarà el primer element de la matriu. Tot i que s’elimina tota la matriu, només es cridarà al destructor del primer element i s’alliberarà la memòria del primer element.
P # 24) Quin és l’ordre en què es destrueixen els objectes d’una matriu?
Resposta: Els objectes d'una matriu es destrueixen en l'ordre invers de construcció: primer construït, darrer destruït.
A l'exemple següent, l'ordre dels destructors serà un [9], un [8], ..., un [1], un [0]:
voiduserCode() { Car a[10]; ... }
Punters
P # 25) Què passa amb aquest codi?
T * p = 0;
esborra p;
Resposta: Al codi anterior, el punter és un punter nul. Segons l’estàndard C ++ 03, és perfectament vàlid trucar a suprimir en un punter NULL. L'operador de supressió s'encarregaria de la comprovació NULL internament.
P # 26) Què és una variable de referència en C ++?
Resposta: Una variable de referència és un nom d'àlies per a la variable existent. Això significa que tant el nom de la variable com la variable de referència apunten a la mateixa ubicació de memòria. Per tant, sempre que s’actualitza la variable, la referència també s’actualitza.
Exemple:
int a=10; int& b = a;
Aquí, b és la referència de a.
Classes d'emmagatzematge
P # 27) Què és una classe d'emmagatzematge? Esmenta les classes d’emmagatzematge en C ++.
Resposta: La classe d'emmagatzematge determina la vida o l'abast de símbols com ara variables o funcions.
C ++ admet les següents classes d'emmagatzematge:
- Automàtic
- Estàtic
- Externa
- Registra't
- Mutable
P # 28) Expliqueu l'especificador de classe d'emmagatzematge mutable.
Resposta: La variable del membre d’un objecte de classe constant no es pot canviar. No obstant això, en declarar les variables com a 'mutables', podem canviar els valors d'aquestes variables.
P # 29) Per a què serveix la paraula clau automàtica?
Resposta: Per defecte, cada variable local de la funció és automàtica, és a dir, automàtic . A la funció següent, les variables «i» i «j» són variables automàtiques.
void f() { int i; auto int j; }
NOTA : Una variable global no és una variable automàtica.
P # 30) Què és una variable estàtica?
Resposta: Una variable estàtica és una variable local que conserva el seu valor a les trucades de funció. Les variables estàtiques es declaren mitjançant la paraula clau 'estàtic'. Les variables numèriques que són estàtiques tenen el valor per defecte com a zero.
La següent funció imprimirà 1 2 3 si es diu tres vegades.
void f() { static int i; ++i; printf(“%d “,i); }
Si una variable global és estàtica, la seva visibilitat es limita al mateix codi font.
P # 31) Quin és el propòsit de l’especificador d’emmagatzematge extern?
Resposta: L'especificador 'Extern' s'utilitza per resoldre l'abast d'un símbol global.
#include using nam espace std; main() { extern int i; cout< Al codi anterior, 'i' pot ser visible fora del fitxer on està definit.
Q # 32) Expliqueu Registre Especificador d'emmagatzematge.
Resposta: S’ha d’utilitzar la variable “Registre” sempre que s’utilitzi la variable. Quan es declara una variable amb un especificador de 'registre', el compilador dóna registre de la CPU per emmagatzemar-lo per accelerar la cerca de la variable.
Q # 33) Quan s'utilitzen arguments de referència 'const' en una funció?
Resposta: L'ús d'arguments de referència 'const' en una funció és beneficiós de diverses maneres:
- 'Const' protegeix dels errors de programació que puguin alterar les dades.
- Com a resultat d'utilitzar 'const', la funció és capaç de processar tant arguments constants com no constants, cosa que no és possible quan no s'utilitza 'const'.
- L’ús d’una referència const permetrà que la funció generi i utilitzi una variable temporal d’una manera adequada.
Estructura i tipus de dades definits per l'usuari
P # 34) Què és una classe?
Resposta: Class és un tipus de dades definit per l'usuari en C ++. Es pot crear per resoldre un tipus de problema concret. Després de la creació, l'usuari no està obligat a conèixer els detalls del funcionament d'una classe.
En general, la classe actua com a pla d’un projecte i pot incloure en diversos paràmetres i funcions o accions que operen en aquests paràmetres. S’anomena membres de la classe.
P # 35) Diferència entre classe i estructura.
Resposta:
Estructura: En llenguatge C, l'estructura s'utilitza per agrupar diferents tipus de tipus de dades. Les variables dins d’una estructura s’anomenen membres de l’estructura. Aquests membres són públics per defecte i s’hi pot accedir mitjançant el nom de l’estructura seguit d’un operador de punts i, a continuació, el nom del membre.
Classe: Class és un successor de l’estructura. C ++ amplia la definició de l'estructura per incloure les funcions que operen als seus membres. Per defecte, tots els membres de la classe són privats.
Programació orientada a objectes amb C ++
Classes, constructors, destructors
P # 36) Què és l'espai de noms?
Resposta: L’espai de noms ens permet agrupar un conjunt de classes globals, objectes i / o funcions sota un nom específic.
La forma general per utilitzar espais de noms és:
identificador d'espai de noms {namespace-body}
On identificador és qualsevol identificador vàlid i el cos de l'espai de noms és el conjunt de classes, objectes i funcions que s'inclouen a l'espai de noms. Els espais de noms són especialment útils en el cas que hi hagi la possibilitat que més d’un objecte tingui el mateix nom, donant lloc a xocs de noms.
P # 37) Per a què serveix la declaració 'utilitzant'?
Resposta: L'ús de Declaració s'utilitza per referir un nom des de l'espai de noms sense l'operador de resolució d'abast.
P # 38) Què és Name Mangling?
Resposta: El compilador C ++ codifica els tipus de paràmetres amb funció / mètode en un nom únic. Aquest procés s’anomena manipulació de noms. El procés invers s’anomena desmuntatge.
Exemple:
A :: b (int, llarg) const és maltractat com 'B__C3Ail' .
Per a un constructor, el nom del mètode es deixa de banda.
Això és A :: A (int, llarg) const és maltractat com 'C3Ail'.
P # 39) Quina diferència hi ha entre un objecte i una classe?
Resposta: Class és un pla d’un projecte o problema que s’ha de resoldre i consta de variables i mètodes. S’anomena membres de la classe. No podem accedir als mètodes o variables de la classe per si mateixos tret que siguin declarats estàtics.
Per accedir als membres de la classe i fer-los servir, hauríem de crear una instància d’una classe que s’anomeni Object. La classe té una vida útil il·limitada, mentre que un objecte només té una vida útil limitada.
P # 40) Quins són els diversos especificadors d'accés a C ++?
Resposta: C ++ admet els següents especificadors d'accés:
- Públic: Els membres i les funcions de dades són accessibles fora de la classe.
- Privat: Els membres i les funcions de dades no són accessibles fora de la classe. L’excepció és l’ús d’una classe d’amics.
- Protegit: Els membres i les funcions de dades només són accessibles a les classes derivades.
Exemple:
Descriviu PRIVAT, PROTEGIT i PÚBLIC juntament amb les seves diferències i doneu exemples.
class A{ int x; int y; public int a; protected bool flag; public A() : x(0) , y(0) {} //default (no argument) constructor }; main(){ A MyObj; MyObj.x = 5; // Compiler will issue a ERROR as x is private int x = MyObj.x; // Compiler will issue a compile ERROR MyObj.x is private MyObj.a = 10; // no problem; a is public member int col = MyObj.a; // no problem MyObj.flag = true; // Compiler will issue a ERROR; protected values are read only bool isFlag = MyObj.flag; // no problem
P # 41) Què és i com es diu un constructor?
Resposta: Constructor és una funció membre de la classe que té el mateix nom que la classe. S'utilitza principalment per inicialitzar els membres de la classe. Per defecte, els constructors són públics.
Hi ha dues maneres en què s’anomenen els constructors:
- Implícitament: El compilador crida implícitament als constructors quan es crea un objecte de la classe. Això crea un objecte en una pila.
- Trucades explícites: Quan es crea l'objecte d'una classe amb nous, es crida explícitament als constructors. Normalment es crea un objecte en un Heap.
Exemple:
class A{ int x; int y; public A() : x(0) , y(0) {} //default (no argument) constructor }; main() { A Myobj; // Implicit Constructor call. In order to allocate memory on stack, //the default constructor is implicitly called. A * pPoint = new A(); // Explicit Constructor call. In order to allocate //memory on HEAP we call the default constructor. }
P # 42) Què és un constructor de còpies i quan es diu?
Resposta: Un constructor de còpies és un constructor que accepta un objecte de la mateixa classe com a paràmetre i copia els seus membres de dades a l'objecte de la part esquerra de l'assignació. És útil quan hem de construir un nou objecte de la mateixa classe.
Exemple:
class A{ int x; int y; public int color; public A() : x(0) , y(0) {} //default (no argument) constructor public A( const A& ) ; }; A::A( const A & p ) { this->x = p.x; this->y = p.y; this->color = p.color; } main() { A Myobj; Myobj.color = 345; A Anotherobj = A( Myobj ); // now Anotherobj has color = 345 }
P # 43) Què és un constructor per defecte?
Resposta: El constructor per defecte és un constructor que no té arguments o, si n'hi ha, tots són arguments per defecte.
Exemple:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv[]) { B b; return 0; }
P # 44) Què és un constructor de conversions?
Resposta: És un constructor que accepta un argument d'un tipus diferent. Els constructors de conversions s’utilitzen principalment per convertir d’un tipus a un altre.
Q # 45) Què és un constructor explícit?
Resposta: Es declara un constructor de conversions amb la paraula clau explícita. El compilador no utilitza un constructor explícit per implementar una conversió implícita de tipus. El seu propòsit es reserva explícitament per a la construcció.
P # 46) Quin és el paper de la paraula clau estàtica per a una variable membre de la classe?
Resposta: La variable membre estàtica comparteix una memòria comuna entre tots els objectes creats per a la classe respectiva. No hem de referir-nos a la variable membre estàtica mitjançant un objecte. Tanmateix, s’hi pot accedir mitjançant el propi nom de la classe.
Q # 47) Expliqueu la funció de membre estàtic.
Resposta: Una funció de membre estàtic només pot accedir a la variable de membre estàtic de la classe. Igual que les variables de membre estàtic, també es pot accedir a una funció de membre estàtic mitjançant el nom de la classe.
Q # 48) Quin és l’ordre en què es destrueixen els objectes locals?
Resposta: penseu en seguir un fragment de codi:
Class A{ …. }; int main() { A a; A b; ... }
A la funció principal, tenim dos objectes creats un darrere l’altre. Es creen per ordre, primer a després b. Però quan se suprimeixen aquests objectes o si surten de l'abast, es cridarà al destructor de cadascun en l'ordre invers en què es van construir.
Per tant, el destructor de b es dirà primer seguit de a. Fins i tot si tenim un conjunt d’objectes, es destruiran de la mateixa manera en l’ordre invers de la seva creació.
Sobrecàrrega
Q # 49) Expliqueu la sobrecàrrega de la funció i la sobrecàrrega de l'operador.
Resposta: C ++ admet el concepte OOPs Polimorfisme que significa 'moltes formes'.
A C ++ tenim dos tipus de polimorfisme, és a dir, polimorfisme en temps de compilació i polimorfisme en temps d'execució. El polimorfisme en temps de compilació s’aconsegueix mitjançant una tècnica de sobrecàrrega. La sobrecàrrega significa simplement donar un significat addicional a una entitat mantenint intacte el seu significat base.
C ++ admet dos tipus de sobrecàrrega:
Funció de sobrecàrrega:
La sobrecàrrega de funcions és una tècnica que permet al programador tenir més d’una funció amb el mateix nom però llista de paràmetres diferents. En altres paraules, sobrecarreguem la funció amb diferents arguments, és a dir, ja sigui el tipus d’arguments, el nombre d’arguments o l’ordre dels arguments.
La sobrecàrrega de la funció no s’aconsegueix mai en el seu tipus de retorn.
Sobrecàrrega de l'operador:
Aquest és un altre tipus de polimorfisme en temps de compilació que és compatible amb C ++. En la sobrecàrrega de l'operador, un operador està sobrecarregat, de manera que pot operar també amb els tipus definits per l'usuari amb els operands del tipus de dades estàndard. Però mentre es fa això, la definició estàndard d’aquest operador es manté intacta.
Per exemple, un operador d'addició (+) que opera en tipus de dades numèriques es pot sobrecarregar per operar en dos objectes igual que un objecte de classe de nombre complexa.
P # 50) Quina diferència hi ha entre la sobrecàrrega del mètode i la substitució del mètode a C ++?
Resposta: La sobrecàrrega de mètodes té funcions amb el mateix nom però llistes d'arguments diferents. Aquesta és una forma de polimorfisme en temps de compilació.
La substitució del mètode apareix quan reescrivim el mètode que es deriva d’una classe base. La substitució del mètode s'utilitza mentre es tracta de polimorfisme en temps d'execució o funcions virtuals.
P # 51) Quina diferència hi ha entre un constructor de còpies i un sobrecarregat Operador de tasques?
Resposta: Un constructor de còpies i un operador d’assignació sobrecarregat tenen bàsicament el mateix propòsit, és a dir, assignar el contingut d’un objecte a un altre. Però, tot i així, hi ha una diferència entre tots dos.
Exemple:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
A l'exemple anterior, la segona sentència c1 = c2 és una sentència d'assignació sobrecarregada.
Aquí, tant c1 com c2 ja són objectes existents i el contingut de c2 s’assigna a l’objecte c1. Per tant, per a la sentència d'assignació sobrecarregada, cal que ja es creen els dos objectes.
A continuació, el complex c3 = c2 és un exemple del constructor de còpies. Aquí, el contingut de c2 s’assigna a un nou objecte c3, el que significa que el constructor de còpia crea un nou objecte cada vegada que s’executa.
P # 52) Anomeneu els operadors que no es poden sobrecarregar.
Resposta:
- sizeof - operador sizeof
- . - Operador de punts
- . * - operador de desferenciació
- -> - operador de desferenciació membre
- :: - operador de resolució d'abast
- ?: - operador condicional
Q # 53) La funció es pot sobrecarregar basant-se en el paràmetre que és un valor o una referència. Expliqueu si l’afirmació és certa.
Resposta: Fals. Tots dos, Passar per valor i Passar per referència tenen un aspecte idèntic al de la persona que truca.
P # 54) Quins avantatges té la sobrecàrrega de l’operador?
Resposta: En sobrecarregar els operadors estàndard en una classe, podem ampliar el significat d’aquests operadors, de manera que també puguin operar en els altres objectes definits per l’usuari.
La sobrecàrrega de funcions ens permet reduir la complexitat del codi i fer-lo més clar i llegible, ja que podem tenir els mateixos noms de funcions amb llistes d’arguments diferents.
Herència
P # 55) Què és l’herència?
Resposta: L’herència és un procés mitjançant el qual podem adquirir les característiques d’una entitat existent i formar una nova entitat afegint-hi més funcions.
En termes de C ++, l’herència crea una nova classe derivant-la d’una classe existent de manera que aquesta nova classe tingui les propietats de la seva classe pare a més de les seves.
P # 56) Quins avantatges té l’herència?
Resposta: L’herència permet la reutilització del codi, amb la qual cosa s’estalvia temps en el desenvolupament del codi.
En heretar, fem ús d’un programari de qualitat sense errors que redueix problemes futurs.
P # 57) C ++ admet herències multinivell i múltiple?
Resposta: Sí.
P # 58) Què són les herències múltiples (herència virtual)? Quins avantatges i desavantatges té?
Resposta: En múltiples herències, tenim més d’una classe base de la qual pot heretar una classe derivada. Per tant, una classe derivada pren les característiques i propietats de més d’una classe base.
Per exemple , una classe conductor tindrà dues classes base, és a dir, empleat i una persona perquè un conductor és un empleat i també una persona. Això és avantatjós perquè la classe conductor pot heretar les propietats de l’empleat i de la classe persona.
Però en el cas d’un empleat i d’una persona, la classe tindrà algunes propietats en comú. Tanmateix, sorgirà una situació ambigua ja que la classe de controlador no coneixerà les classes de les quals s’haurien d’heretar les propietats comunes. Aquest és el principal desavantatge de múltiples herències.
P # 59) Expliqueu les relacions de classe ISA i HASA. Com implementaria cadascun?
Resposta: La relació 'ISA' sol mostrar herència ja que implica que una versió especialitzada d'una classe 'ISA' d'una altra classe. Per exemple , Una persona ISA empleada. Això significa que una classe d'empleats s'hereta de la classe Persona.
Al contrari que 'ISA', la relació 'HASA' representa que una entitat pot tenir una altra entitat com a membre o que una classe té un altre objecte incrustat dins d'ella.
Així doncs, prenent el mateix exemple d’una classe d’empleats, la forma en què associem la classe de salari a l’empleat no consisteix en heretar-la sinó en incloure o contenir l’objecte Salari dins de la classe d’empleats. La relació 'HASA' es mostra millor mitjançant la contenció o l'agregació.
P # 60) Una classe derivada hereta o no hereta?
Resposta: Quan una classe derivada es construeix a partir d’una classe base particular, hereta bàsicament totes les característiques i els membres ordinaris de la classe base. Però hi ha algunes excepcions a aquesta regla. Per exemple, una classe derivada no hereta els constructors i destructors de la classe base.
Cada classe té els seus propis constructors i destructors. La classe derivada tampoc no hereta l'operador d'assignació de la classe base i els amics de la classe. La raó és que aquestes entitats són específiques d’una classe particular i, si es deriva una altra classe o si és l’amic d’aquesta classe, no se’ls pot passar.
Polimorfisme
P # 61) Què és el polimorfisme?
Resposta: La idea bàsica darrere del polimorfisme es troba en moltes formes. A C ++, tenim dos tipus de polimorfisme:
(i) Polimorfisme en temps de compilació
En el polimorfisme en temps de compilació, aconseguim moltes formes mitjançant la sobrecàrrega. Per tant, tenim una sobrecàrrega d’operador i una sobrecàrrega de funcions. (Ja ho hem tractat anteriorment)
(ii) Polimorfisme en temps d'execució
Aquest és el polimorfisme per a classes i objectes. La idea general és que una classe base pot ser heretada per diverses classes. Un punter de classe base pot assenyalar la seva classe fill i una matriu de classe base pot emmagatzemar diferents objectes de classe secundària.
Això vol dir que un objecte reacciona de manera diferent a la mateixa trucada de funció. Aquest tipus de polimorfisme pot utilitzar un mecanisme de funció virtual.
P # 62) Què són les funcions virtuals?
Resposta: Una funció virtual permet a les classes derivades substituir la implementació proporcionada per la classe base.
Sempre que tenim funcions amb el mateix nom a la classe base i derivada, sorgeix una ambigüitat quan intentem accedir a l’objecte de classe fill mitjançant un punter de classe base. Com que fem servir un punter de classe base, la funció que s’anomena és la funció de classe base amb el mateix nom.
Per corregir aquesta ambigüitat, utilitzem la paraula clau 'virtual' abans del prototip de funció a la classe base. En altres paraules, fem que aquesta funció polimòrfica sigui virtual. Mitjançant l'ús d'una funció virtual, podem eliminar l'ambigüitat i accedir correctament a totes les funcions de classe secundària mitjançant un punter de classe base.
P # 63) Poseu un exemple de polimorfisme en temps d'execució / funcions virtuals.
Resposta:
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; coutEn el codi anterior, la classe SHAPE té una funció virtual pura i és una classe abstracta (no es pot instanciar). Cada classe es deriva de la funció SHAPE que implementa la funció Draw () a la seva manera.
A més, cada funció Draw és virtual, de manera que quan fem servir un punter de classe base (SHAPE) cada vegada amb l'objecte de les classes derivades (Circle i SQUARE), es criden les funcions Draw adequades.
P # 64) Què vol dir amb Funcions Virtuals Pures?
Resposta: Una funció de membre virtual pur és una funció de membre en què la classe base obliga a anul·lar les classes derivades. Normalment, aquesta funció membre no té cap implementació. Les funcions virtuals pures s’equiparen a zero.
Exemple:
class Shape { public: virtual void draw() = 0; };
Una classe base que té una funció virtual pura ja que el seu membre es pot anomenar com a 'classe abstracta'. Aquesta classe no es pot crear una instància i normalment actua com un pla que té diverses subclases amb una implementació posterior.
P # 65) Què són els constructors / destructors virtuals?
Resposta:
Destructors virtuals: Quan fem servir un punter de classe base que apunta a un objecte de classe derivat i l’utilitzem per destruir-lo, en lloc de cridar al destructor de classes derivades, s’anomena destructor de classe base.
Exemple:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Com es mostra a l’exemple anterior, quan diem suprimir a, es diu el destructor, però en realitat és el destructor de la classe base. Això dóna lloc a l’ambigüitat que tota la memòria de b no s’esborra correctament.
Aquest problema es pot resoldre mitjançant el concepte “Virtual Destructor”.
El que fem és fer que el constructor de la classe base sigui “Virtual” perquè tots els destructors de la classe fill també esdevinguin virtuals i quan eliminem l’objecte de la classe base que apunta a l’objecte de la classe derivada, es diu el destructor adequat i tot els objectes s’esborren correctament.
Això es mostra de la següent manera:
què són les metadades a l’emmagatzematge de dades
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
virtual constructor : Els constructors no poden ser virtuals. Declarar un constructor com a funció virtual és un error de sintaxi.
Amic
P # 66) Què és una funció amic?
Resposta: La classe C ++ no permet accedir als seus membres privats i protegits fora de la classe. Però aquesta regla es pot violar fent ús del ' Amic ”Funció.
Com el seu propi nom indica, la funció amiga és una funció externa que és amiga de la classe. Perquè la funció amic accedeixi als mètodes privats i protegits de la classe, hauríem de tenir un prototip de la funció amic amb la paraula clau 'amic' inclosa dins de la classe.
P # 67) Què és una classe d'amics?
Resposta: Les classes d'amics s'utilitzen quan hem de substituir la regla per als especificadors d'accés privat i protegit de manera que dues classes puguin treballar estretament entre si.
Per tant, podem tenir una classe d’amics per ser amics d’una altra classe. D’aquesta manera, les classes d’amics poden mantenir les coses privades i inaccessibles tal com són.
Quan tenim el requisit d’accedir a la implementació interna d’una classe (membre privat) sense exposar els detalls fent públics, anem per funcions d’amics.
C ++ avançat
Plantilles
Q # 68) Què és una plantilla?
Resposta: Les plantilles permeten crear funcions independents del tipus de dades (genèriques) i que poden prendre qualsevol tipus de dades com a paràmetres i retornar el valor sense haver de sobrecarregar la funció amb tots els tipus de dades possibles. Les plantilles gairebé compleixen la funcionalitat d'una macro.
El seu prototip és qualsevol dels següents:
plantilla identificar > declaració_funció;
plantilla identificar > declaració_funció;
L’única diferència entre ambdós prototips és l’ús de classe de paraules clau o typename. La seva funcionalitat bàsica de ser genèrics continua sent la mateixa.
Manipulació d’excepcions
P # 69) Què és el tractament d'excepcions? C ++ admet el maneig d'excepcions?
Resposta: Sí, C ++ admet la gestió d'excepcions.
No podem assegurar-nos que el codi s’executi amb normalitat en tot moment. Hi pot haver certes situacions que puguin obligar el funcionament erroni del codi escrit per nosaltres, tot i que no conté errors. Es diu aquest mal funcionament del codi Excepció .
Quan s'ha produït una excepció, el compilador ha de llançar-la de manera que sabem que s'ha produït una excepció. Quan s'ha produït una excepció, el compilador ha d'assegurar-se que es tracta correctament, de manera que el flux del programa continuï o finalitzi correctament. Es diu això maneig d’una excepció.
Així, en C ++, tenim tres paraules clau, és a dir, provar , llançar i atrapar que es tracten excepcionalment.
La sintaxi general del bloc d’excepcions és:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Com es mostra més amunt, el codi que podria funcionar malament es posa al bloc try. Quan el codi funciona malament, es produeix una excepció. Aquesta excepció es captura sota el bloc de captura i es gestiona, és a dir, es prenen les mesures adequades.
P # 70) Comenteu excepcions estàndard de C ++?
Resposta: C ++ admet algunes excepcions estàndard que es poden detectar si posem el codi dins del bloc try. Aquestes excepcions formen part de la classe base ' std :: excepció ”. Aquesta classe es defineix al fitxer de capçalera C ++.
Alguns exemples d’excepcions admeses per aquesta classe inclouen:
bad_alloc: llançat per 'nou'
runtime_error: generat per errors en temps d'execució
bad_typeid: llançat per identificador de tipus
Introducció a la biblioteca de plantilles estàndard
P # 71) Què és una biblioteca de plantilles estàndard (STL)? Quins són els diversos tipus de contenidors STL?
Resposta: Una biblioteca de plantilles estàndard (STL) és una biblioteca de plantilles de contenidors aprovades pel comitè ANSI per incloure-les a l'especificació estàndard de C ++. Disposem de diversos tipus de contenidors STL en funció de com emmagatzemen els elements.
- Cua, pila - Són els mateixos que els tradicionals de cua i apilament i s’anomenen contenidors adaptatius.
- Conjunt, mapa - Es tracta bàsicament de contenidors que tenen parells clau / valor i tenen un caràcter associatiu.
- Vector, i - Són de naturalesa seqüencial i tenen similituds amb matrius.
P # 72) Què és una classe Iterator?
Resposta: A C ++, una classe contenidor és una col·lecció d’objectes diferents.
Si hem de recórrer aquesta col·lecció d’objectes, no ho podem fer mitjançant variables d’índex simples. Per tant, tenim una classe especial en STL anomenada an Iterador classe que es pot utilitzar per recórrer el contingut de la classe de contenidors.
Inclouen les diverses categories d'iteradors iteradors d'entrada, iteradors de sortida, iteradors directes, iteradors bidireccionals, accés aleatori, etc.
Q # 73) Quina diferència hi ha entre un iterador extern i un iterador intern? Descriviu un avantatge de l'iterador extern.
Resposta: S'implementa un iterador intern amb funcions de membre de la classe que tenen elements per passar.
Un iterador extern s’implementa com una classe independent que es pot lligar a l’objecte que té elements per passar. L’avantatge bàsic d’un iterador extern és que és fàcil d’implementar ja que s’implementa com a classe independent.
En segon lloc, com que és una classe diferent, molts objectes iteradors poden estar actius simultàniament.
Lectures addicionals => Preguntes de l'entrevista C #
Conclusió
Gairebé tots els principals temes de codificació i programació de l'entrevista C ++ es tracten en aquest article.
Esperem que qualsevol candidat se senti relaxat després de preparar-se per a una entrevista amb aquesta sèrie de preguntes sobre l'entrevista.
Tot el millor per a la vostra entrevista !!
Lectura recomanada
- Preguntes i respostes de l’entrevista
- Preguntes i respostes de l'entrevista de proves ETL
- Algunes preguntes i respostes de proves manuals complicades
- 25 millors preguntes i respostes d’entrevista de proves àgils
- Preguntes d'entrevistes amb respostes a Spock (més populars)
- Algunes preguntes d’entrevistes de proves de programari interessants
- Top 20+ Preguntes i respostes de l'entrevista .NET
- Top 32 de les millors preguntes i respostes de l’entrevista Datastage