top 70 c interview questions
Ofte stillede grundlæggende og avancerede C ++ Interviewspørgsmål med kodeeksempler til kandidater på entry level såvel som erfarne fagfolk:
Denne detaljerede artikel vil helt sikkert være et bogmærke for dem, der forbereder sig på et C ++ - interview.
Næsten alle de store emner i C ++ er dækket her sammen med nogle grundlæggende spørgsmål om avancerede emner som Standard Template Library (STL) osv.
Dette sæt af C ++ - kodningsspørgsmål hjælper dig med at møde ethvert C ++ - interview med tillid og rydde det med succes ved første forsøg.
Hvad du lærer:
- C ++ Interviewspørgsmål med kodeeksempler
C ++ Interviewspørgsmål med kodeeksempler
Nedenfor er de mest populære spørgsmål til C ++ programmeringsinterview, der besvares af en C ++ - ekspert.
Læs også => Top C-programmeringsinterviewspørgsmål
Grundlæggende C ++
Struktur af C ++ - programmet
Q # 1) Hvad er den grundlæggende struktur for et C ++ - program?
Svar: Den grundlæggende struktur for et C ++ - program er vist nedenfor:
#include int main() { cout<<”Hello,World!”; return 0; }
Den første linje, der begynder med “ # ' er en preprocessor-direktivet . I dette tilfælde bruger vi omfatte som et direktiv, der fortæller kompilatoren at medtage et header, mens “ iostream.h ”Som vil blive brugt til grundlæggende input / output senere i programmet.
Den næste linje er 'hoved' -funktionen, der returnerer et heltal. Hovedfunktionen er startpunktet for udførelse af ethvert C ++ - program. Uanset dens placering i kildekodefilen udføres indholdet af hovedfunktionen altid først af C ++ - kompilatoren.
I den næste linje kan vi se åbne krøllede seler, der indikerer starten på en blok med kode. Efter dette ser vi programmeringsinstruktionen eller den kodelinje, der bruger optællingen, som er standardudgangsstrømmen (dens definition er til stede i iostream.h).
Denne outputstrøm tager en række tegn og udskriver den til en standard outputenhed. I dette tilfælde er det 'Hej verden!'. Bemærk, at hver C ++ instruktion slutter med et semikolon (;), hvilket er meget nødvendigt, og hvis du udelader det, vil det resultere i kompileringsfejl.
Før vi lukker seler}, ser vi en anden linje 'return 0;'. Dette er returpunktet til hovedfunktionen.
Hvert C ++ - program har en grundlæggende struktur som vist ovenfor med et forprocessordirektiv, hovedfunktionserklæring efterfulgt af en blok af kode og derefter et returpunkt til hovedfunktionen, som indikerer en vellykket udførelse af programmet.
Q # 2) Hvad er kommentarerne i C ++?
Svar: Kommentarer i C ++ er simpelthen et stykke kildekode, der ignoreres af compileren. De er kun nyttige for en programmør til at tilføje en beskrivelse eller yderligere oplysninger om deres kildekode.
I C ++ er der to måder at tilføje kommentarer på:
- // enkeltlinjekommentar
- / * blok kommentar * /
Den første type vil kassere alt, når compileren støder på “//”. I den anden type kasserer compileren alt mellem “/ *” og “* /”.
Variabler, datatyper og konstanter
Q # 3) Forskel mellem erklæring og definition af en variabel.
Svar: Erklæringen af en variabel angiver blot datatypen for en variabel og variabelnavnet. Som et resultat af erklæringen beder vi kompilatoren om at reservere plads til en variabel i hukommelsen i henhold til den specificerede datatype.
Eksempel:
int Result; char c; int a,b,c;
Alle ovenstående er gyldige erklæringer. Bemærk også, at værdien af variablen som et resultat af erklæringen ikke er bestemt.
Mens en definition er en implementering / instantiering af den deklarerede variabel, hvor vi binder passende værdi til den deklarerede variabel, så linkeren vil være i stand til at linke henvisninger til de relevante enheder.
Fra ovenstående eksempel ,
Resultat = 10;
C = ‘A’;
Disse er gyldige definitioner.
Spørgsmål nr. 4) Kommentar til det lokale og globale omfang af en variabel.
Svar: Omfanget af en variabel er defineret som omfanget af programkoden, inden for hvilken variablen forbliver aktiv, dvs. den kan deklareres, defineres eller arbejdes med.
Der er to typer anvendelsesområde i C ++:
- Lokalt anvendelsesområde: En variabel siges at have et lokalt omfang eller er lokal, når den erklæres inde i en kodeblok. Variablen forbliver kun aktiv inde i blokken og er ikke tilgængelig uden for kodeblokken.
- Globalt anvendelsesområde: En variabel har et globalt anvendelsesområde, når den er tilgængelig i hele programmet. En global variabel erklæres oven på programmet før alle funktionsdefinitioner.
Eksempel:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Spørgsmål nr. 5) Hvad har forrang, når der er en global variabel og en lokal variabel i programmet med samme navn?
Svar: Når der er en lokal variabel med samme navn som den for en global variabel, giver compileren den lokale variabel forrang.
Eksempel:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Outputtet fra ovenstående kode er 5. Dette skyldes, at selvom begge variabler har samme navn, har compileren foretrukket det lokale omfang.
Spørgsmål nr. 6) Når der er en global variabel og en lokal variabel med samme navn, hvordan får du adgang til den globale variabel?
Svar: Når der er to variabler med samme navn, men forskellige omfang, dvs. den ene er en lokal variabel, og den anden er en global variabel, foretrækker compileren en lokal variabel.
For at få adgang til den globale variabel bruger vi en ” omfangsopløsningsoperator (: :) ”. Ved hjælp af denne operator kan vi få adgang til værdien af den globale variabel.
Eksempel:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Produktion:
Global variabel x = 10
lokal variabel x = 2
Spørgsmål nr. 7) Hvor mange måder er der til at initialisere en int med en konstant?
Svar: Der er to måder:
- Det første format bruger traditionel C-notation.
int resultat = 10; - Det andet format bruger konstruktørnotationen.
int-resultat (10);
Konstanter
Q # 8) Hvad er en konstant? Forklar med et eksempel.
Svar: En konstant er et udtryk, der har en fast værdi. De kan opdeles i heltal, decimal, flydende punkt, karakter eller strengkonstanter afhængigt af deres datatype.
Bortset fra decimalet understøtter C ++ også to flere konstanter, dvs. oktale (til basen 8) og hexadecimale (til basen 16) -konstanter.
Eksempler på konstanter:
- 75 // heltal (decimal)
- 0113 // oktal
- 0x4b // hexadecimal
- 3.142 // flydende punkt
- 'C' // tegn konstant
- “Hej, verden” // strengekonstant
Bemærk: Når vi skal repræsentere et enkelt tegn, bruger vi enkelt anførselstegn, og når vi ønsker at definere en konstant med mere end et tegn, bruger vi dobbelt anførselstegn.
Q # 9) Hvordan definerer / erklærer du konstanter i C ++?
Svar: I C ++ kan vi definere vores egne konstanter ved hjælp af #Definere preprocessor-direktivet.
#define Identifier value
Eksempel:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Produktion: Område af en cirkel = 78,55
Som vist i ovenstående eksempel, når vi definerer en konstant ved hjælp af #define-direktivet, kan vi bruge den i hele programmet og erstatte dens værdi.
Vi kan erklære konstanter i C ++ ved hjælp af “ konst ”Nøgleord. Denne måde svarer til at erklære en variabel, men med et const-præfiks.
Eksempler på at erklære en konstant
const int pi = 3.142;
const char c = “sth”;
const postnummer = 411014;
I ovenstående eksempler, når typen af en konstant ikke er specificeret, er C ++ - kompilatoren standard som en heltalstype.
Operatører
Q # 10) Kommentar til Assignment Operator i C ++.
Svar: Tildelingsoperator i C ++ bruges til at tildele en værdi til en anden variabel.
a = 5;
Denne kodelinje tildeler heltalets værdi 5 til variabel til .
Delen til venstre for = operatoren er kendt som en værdi (venstre værdi) og højre som rværdi (rigtig værdi). L værdi skal altid være en variabel, mens højre side kan være en konstant, en variabel, resultatet af en operation eller en hvilken som helst kombination af dem.
Opgaverne foregår altid fra højre mod venstre og aldrig omvendt.
En egenskab, som C ++ har over de andre programmeringssprog, er, at tildelingsoperatøren kan bruges som rværdi (eller en del af en rværdi ) til en anden opgave.
Eksempel:
a = 2 + (b = 5);
svarer til:
b = 5;
a = 2 + b;
Hvilket betyder, først tildele 5 til variabel b og tildel derefter til til, værdien to plus resultatet af det forrige udtryk for b (det vil sige 5), blade til med en endelig værdi på 7 .
Følgende udtryk er således også gyldigt i C ++:
a = b = c = 5;
tildel 5 til variabler til , b og c .
Q # 11) Hvad er forskellen mellem lig med (==) og Assignment Operator (=)?
Svar: I C ++ er lig med (==) og tildelingsoperator (=) to helt forskellige operatorer.
Lige med (==) er en lighedsrelationsoperator, der evaluerer to udtryk for at se, om de er lige, og returnerer sandt, hvis de er lige og falske, hvis de ikke er.
Tildelingsoperatøren (=) bruges til at tildele en værdi til en variabel. Derfor kan vi have en kompleks opgaveoperation inden for ligestillingsoperatøren til evaluering.
Q # 12) Hvad er de forskellige aritmetiske operatører i C ++?
Svar: C ++ understøtter følgende aritmetiske operatorer:
- + tilføjelse
- - subtraktion
- * multiplikation
- / division
- % modul
Lad os demonstrere de forskellige aritmetiske operatorer med følgende stykke kode.
Eksempel:
#include int main () { int a=5, b=3; cout<<”a + b = “< Produktion :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Som vist ovenfor er alle de andre operationer ligetil og de samme som faktiske aritmetiske operationer, bortset fra modulo-operatoren, som er helt anderledes. Modulo-operatøren deler a og b, og resultatet af operationen er resten af divisionen.
Q # 13) Hvad er de forskellige sammensatte tildelingsoperatører i C ++?
Svar: Følgende er sammensatte tildelingsoperatører i C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
Sammensat tildelingsoperator er en af de vigtigste funktioner i C ++ sprog, som giver os mulighed for at ændre værdien af en variabel med en af de grundlæggende operatorer:
Eksempel:
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) Angiv forskellen mellem operationer før og efter stigning / nedgang.
Svar: C ++ tillader to operatorer, dvs. ++ (inkrement) og - (decrement), der giver dig mulighed for at tilføje 1 til den eksisterende værdi af en variabel og trække 1 fra henholdsvis variablen. Disse operatører kaldes igen increment (++) og decrement (-).
Eksempel:
a = 5;
a ++;
Den anden sætning, a ++, får 1 til at føjes til værdien af a. Således svarer a ++ til
a = a + 1; eller
a + = 1;
Et unikt træk ved disse operatorer er, at vi kan forudse eller tilføje disse operatorer med variablen. Derfor, hvis a er en variabel, og vi præfikser stigningsoperatoren, vil den være
++ a;
Dette kaldes Pre-increment. På samme måde har vi også en forudgående reduktion.
Hvis vi præfikser variablen a med en stigningsoperator, har vi,
a ++;
Dette er eftertilvæksten. Ligeledes har vi også en dekrement.
Forskellen mellem betydningen af præ og post afhænger af, hvordan udtrykket evalueres, og resultatet lagres.
I tilfælde af før-forøgelse / nedbrydningsoperator udføres til- / nedbrydningsoperationen først, og derefter overføres resultatet til en værdi. Mens der for operationer efter forøgelse / nedgang, evalueres værdien først, og derefter udføres forøgelse / nedgang i overensstemmelse hermed.
Eksempel:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
-en; # a = 5
b ++; # 6
I / O gennem konsol
Q # 15) Hvad er operatorerne til ekstraktion og indsættelse i C ++? Forklar med eksempler.
Svar: I iostream.h-biblioteket i C ++, Kina og koste er de to datastrømme, der bruges til henholdsvis input og output. Cout dirigeres normalt til skærmen, og cin tildeles tastaturet.
“Cin” (udvindingsoperatør): Ved at bruge overbelastet operatør >> med cin-stream håndterer C ++ standardindgangen.
int age; cin>>age;
Som vist i ovenstående eksempel erklæres en heltalsvariabel 'alder', og derefter venter den på, at cin (tastatur) indtaster dataene. “Cin” behandler kun input, når der trykkes på RETURN-tasten.
“Cout” (indsættelsesoperatør): Dette bruges sammen med overbelastet<< operator. It directs the data that followed it into the cout stream.
Eksempel:
hvordan man kalder en funktion i hovedpython
cout<<”Hello, World!”; cout<<123;
Kontrolstrukturer og funktioner
Kontrolstrukturer og løkker
Spørgsmål nr. 16) Hvad er forskellen mellem while og do while loop? Forklar med eksempler.
Svar: Formatet for while loop i C ++ er:
Mens (udtryk)
{udsagn;}
Sætningsblokken under while udføres, så længe betingelsen i det givne udtryk er sand.
Eksempel:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<I ovenstående kode vil sløjfen direkte afslutte, hvis n er 0. Således i løbet af sløjfen er den afsluttende tilstand i begyndelsen af sløjfen, og hvis den er opfyldt, udføres der ikke gentagelser af sløjfen.
Dernæst overvejer vi do-while-sløjfen.
Det generelle format for do-while er:
gør {udsagn;} mens (betingelse);
Eksempel:
#include int main() { int n; cout<>n; do { cout<I ovenstående kode kan vi se, at udsagnet inde i sløjfen udføres mindst én gang, da sløjfebetingelsen er i slutningen. Dette er de største forskelle mellem mens og gør-mens.
I tilfælde af while-loop kan vi gå direkte ud af loop i begyndelsen, hvis betingelsen ikke er opfyldt, mens vi i do-while-loop udfører loop-udsagn mindst en gang.
Funktioner
Spørgsmål nr. 17) Hvad mener du med 'ugyldig' returtype?
Svar: Alle funktioner skal returnere en værdi i henhold til den generelle syntaks.
Hvis vi imidlertid ikke ønsker, at en funktion skal returnere nogen værdi, bruger vi ' ugyldig ”For at angive det. Dette betyder, at vi bruger “ ugyldig ”For at angive, at funktionen ikke har nogen returværdi, eller den returnerer“ ugyldig ”.
Eksempel:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 18) Forklar Pass by Value og Pass by Reference.
Svar: Mens vi sender parametre til funktionen ved hjælp af 'Pass by Value', sender vi en kopi af parametrene til funktionen.
Derfor ændres uanset hvilke ændringer der foretages af parametrene i den kaldte funktion ikke tilbage til den kaldende funktion. Således forbliver variablerne i opkaldsfunktionen uændrede.
Eksempel:
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 = “< Produktion:
x = 1
y = 3
z = 4
Som set ovenfor, skønt parametrene blev ændret i den kaldte funktion, blev deres værdier ikke afspejlet i den kaldende funktion, da de blev sendt af værdi.
Men hvis vi ønsker at få de ændrede værdier fra funktionen tilbage til opkaldsfunktionen, så bruger vi 'Pass by Reference' -teknikken.
For at demonstrere dette ændrer vi ovenstående program som følger:
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 = “< Produktion:
x = 2
y = 6
z = 8
Som vist ovenfor overføres de ændringer, der er foretaget til parametrene i de kaldte funktioner, til opkaldsfunktionen, når vi bruger teknikken 'Pass by reference'. Dette skyldes, at ved hjælp af denne teknik sender vi ikke en kopi af parametrene, men vi overfører faktisk variabelens reference.
Spørgsmål nr. 19) Hvad er standardparametre? Hvordan evalueres de i C ++ - funktionen?
Svar: Standardparameter er en værdi, der tildeles hver parameter, mens deklarerer en funktion.
Denne værdi bruges, hvis denne parameter efterlades tom, mens der kaldes til funktionen. For at specificere en standardværdi for en bestemt parameter tildeler vi blot en værdi til parameteren i funktionserklæringen.
Hvis værdien ikke overføres til denne parameter under funktionsopkaldet, bruger compileren den angivne standardværdi. Hvis der angives en værdi, trædes denne standardværdi på, og den beståede værdi bruges.
Eksempel:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Produktion:
12
6
Som vist i ovenstående kode er der to opkald til at multiplicere funktionen. I det første opkald sendes kun en parameter med en værdi. I dette tilfælde er den anden parameter den angivne standardværdi. Men i det andet opkald, da begge parameterværdier overføres, tilsidesættes standardværdien, og den overførte værdi bruges.
Q # 20) Hvad er en Inline-funktion i C ++?
Svar: Inline-funktion er en funktion, der kompileres af compileren som det punkt, hvor funktionen kaldes, og koden erstattes på det tidspunkt. Dette gør kompileringen hurtigere. Denne funktion defineres ved at prefikse funktionsprototypen med nøgleordet 'inline'.
Sådanne funktioner er kun fordelagtige, når koden til den integrerede funktion er lille og enkel. Selvom en funktion er defineret som Inline, er den fuldstændig kompilatorafhængig at evaluere den som inline eller ej.
Avanceret datastruktur
Arrays
Q # 21) Hvorfor behandles arrays normalt med for loop?
Svar: Array bruger indekset til at krydse hvert af dets elementer.
Hvis A er en matrix, får man adgang til hvert af dens elementer som A (i). Programmatisk er alt, hvad der kræves for at dette skal fungere, en iterativ blok med en loop-variabel i, der fungerer som et indeks (tæller), der øges fra 0 til A. længde-1.
Dette er præcis, hvad en sløjfe gør, og det er grunden til, at vi behandler arrays ved hjælp af sløjfer.
Q # 22) Angiv forskellen mellem slet og slet ().
Svar: “Delete ()” bruges til at frigøre den hukommelse, der er allokeret til et array, der blev allokeret ved hjælp af ny (). 'Slet' bruges til at frigive et stykke hukommelse, der blev allokeret ved hjælp af nyt.
værktøjer til indsamling af krav, der bruges af forretningsanalytikere
Spørgsmål nr. 23) Hvad er der galt med denne kode?
T * p = ny T (10);
slet p;
Svar: Ovenstående kode er syntaktisk korrekt og kompilerer fint.
Det eneste problem er, at det bare sletter det første element i arrayet. Selvom hele arrayet slettes, kaldes kun destruktoren for det første element, og hukommelsen for det første element frigives.
Spørgsmål nr. 24) Hvad er rækkefølgen, i hvilken objekterne i en matrix destrueres?
Svar: Objekter i en matrix destrueres i omvendt rækkefølge af konstruktion: Først konstrueret, sidst destrueret.
I det følgende eksempel, ordren for destruktører vil være en (9), en (8),…, en (1), en (0):
voiduserCode() { Car a(10); ... }
Markører
Spørgsmål nr. 25) Hvad er der galt med denne kode?
T * p = 0;
slet p;
Svar: I ovenstående kode er markøren en nullmarkør. I henhold til C ++ 03-standarden er det perfekt at kalde sletning på en NULL-markør. Sletoperatøren tager sig af NULL-kontrollen internt.
Q # 26) Hvad er en referencevariabel i C ++?
Svar: En referencevariabel er et aliasnavn for den eksisterende variabel. Dette betyder, at både variabelnavnet og referencevariablen peger på den samme hukommelsesplacering. Derfor, når variablen opdateres, opdateres referencen også.
Eksempel:
int a=10; int& b = a;
Her er b henvisningen til a.
Opbevaringsklasser
Spørgsmål nr. 27) Hvad er en lagerklasse? Nævn lagerklasser i C ++.
Svar: Opbevaringsklasse bestemmer levetiden eller omfanget af symboler såsom variabel eller funktioner.
C ++ understøtter følgende lagringsklasser:
- Auto
- Statisk
- Ekstern
- Tilmeld
- Omskiftelig
Q # 28) Forklar Mutable Storage-klassespecifikator.
Svar: Variablen for et medlem af et konstant objekt i en klasse kan ikke ændres. Ved at erklære variablerne som 'mutable' kan vi dog ændre værdierne for disse variabler.
Spørgsmål nr. 29) Hvad er nøgleordet auto til?
Svar: Som standard er hver lokale variabel i funktionen automatisk, dvs. auto . I nedenstående funktion er både variablerne 'i' og 'j' automatiske variabler.
void f() { int i; auto int j; }
BEMÆRK : En global variabel er ikke en automatisk variabel.
Spørgsmål nr. 30) Hvad er en statisk variabel?
Svar: En statisk variabel er en lokal variabel, der bevarer sin værdi på tværs af funktionsopkaldene. Statiske variabler erklæres ved hjælp af nøgleordet 'statisk'. Numeriske variabler, der er statiske, har standardværdien som nul.
Den følgende funktion udskriver 1 2 3, hvis den kaldes tre gange.
void f() { static int i; ++i; printf(“%d “,i); }
Hvis en global variabel er statisk, er dens synlighed begrænset til den samme kildekode.
Spørgsmål nr. 31) Hvad er formålet med Extern Storage Specifier?
Svar: Specifikatoren “Ekstern” bruges til at løse omfanget af et globalt symbol.
#include using nam espace std; main() { extern int i; cout< I ovenstående kode kan “i” være synlig uden for filen, hvor den er defineret.
Q # 32) Forklar Register Storage Specifier.
Svar: Variablen 'Register' skal bruges, når variablen bruges. Når en variabel erklæres med en 'register' -specifikator, giver compileren CPU-register til sin lagring for at fremskynde opslaget af variablen.
Spørgsmål nr. 33) Hvornår skal man bruge “const” reference argumenter i en funktion?
Svar: Brug af 'const' reference argumenter i en funktion er gavnligt på flere måder:
- “Const” beskytter mod programmeringsfejl, der kan ændre data.
- Som et resultat af brugen af 'const' er funktionen i stand til at behandle både const og non-const faktiske argumenter, hvilket ikke er muligt, når 'const' ikke bruges.
- Brug af en const-reference giver funktionen mulighed for at generere og bruge en midlertidig variabel på en passende måde.
Struktur og brugerdefinerede datatyper
Spørgsmål nr. 34) Hvad er en klasse?
Svar: Klasse er en brugerdefineret datatype i C ++. Det kan oprettes for at løse en bestemt form for problem. Efter oprettelsen er brugeren ikke forpligtet til at kende detaljerne i, hvordan en klasse fungerer.
Generelt fungerer klassen som en plan for et projekt og kan inkludere i forskellige parametre og funktioner eller handlinger, der fungerer på disse parametre. Disse kaldes klassens medlemmer.
Q # 35) Forskel mellem klasse og struktur.
Svar:
Struktur: På C-sprog bruges strukturen til at pakke forskellige typer datatyper sammen. Variablerne inde i en struktur kaldes strukturens medlemmer. Disse medlemmer er som standard offentlige og kan tilgås ved hjælp af strukturnavnet efterfulgt af en prikoperator og derefter medlemsnavnet.
Klasse: Klassen er en efterfølger af strukturen. C ++ udvider strukturdefinitionen til at omfatte de funktioner, der fungerer på dens medlemmer. Som standard er alle medlemmer i klassen private.
Objektorienteret programmering med C ++
Klasser, konstruktører, destruktører
Spørgsmål nr. 36) Hvad er navneområde?
Svar: Navneområdet giver os mulighed for at gruppere et sæt globale klasser, objekter og / eller funktioner under et specifikt navn.
Den generelle form til brug af navneområder er:
namespace-id {namespace-body}
Hvor identifikator er en hvilken som helst gyldig identifikator, og namespace-body er det sæt af klasser, objekter og funktioner, der er inkluderet i navneområdet. Navneområder er især nyttige i det tilfælde, hvor der er mulighed for, at mere end et objekt har samme navn, hvilket resulterer i navnekollisioner.
Spørgsmål nr. 37) Hvad er brugen af 'bruger' erklæring?
Svar: Brug af erklæring bruges til at henvise et navn fra navneområdet uden operatøren for omfangsopløsning.
Q # 38) Hvad er navnemangling?
Svar: C ++ compiler koder parametertyperne med funktion / metode til et unikt navn. Denne proces kaldes manglende navn. Den omvendte proces kaldes demangling.
Eksempel:
A :: b (int, lang) const er manglet som 'B__C3Ail' .
For en konstruktør udelades metodens navn.
Det er A :: A (int, lang) const er manglet som 'C3Ail'.
Q # 39) Hvad er forskellen mellem et objekt og en klasse?
Svar: Klassen er en plan for et projekt eller problem, der skal løses, og består af variabler og metoder. Disse kaldes klassens medlemmer. Vi har ikke adgang til klasserets metoder eller variabler alene, medmindre de erklæres statiske.
For at få adgang til klassemedlemmerne og bruge dem, skal vi oprette en forekomst af en klasse, der kaldes et objekt. Klassen har en ubegrænset levetid, mens et objekt kun har en begrænset levetid.
Q # 40) Hvad er de forskellige adgangsspecifikatorer i C ++?
Svar: C ++ understøtter følgende adgangsspecifikatorer:
- Offentlig: Datamedlemmer og funktioner er tilgængelige uden for klassen.
- Privat: Datamedlemmer og funktioner er ikke tilgængelige uden for klassen. Undtagelsen er brugen af en vensklasse.
- Beskyttet: Datamedlemmer og funktioner er kun tilgængelige for de afledte klasser.
Eksempel:
Beskriv PRIVAT, BESKYTTET og OFFENTLIG sammen med deres forskelle og giv eksempler.
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) Hvad er en konstruktør, og hvordan kaldes den?
Svar: Constructor er en medlemsfunktion i klassen med samme navn som klassen. Det bruges hovedsageligt til initialisering af klassens medlemmer. Som standard er konstruktører offentlige.
Der er to måder, hvorpå konstruktørerne kaldes:
- Implicit: Konstruktører kaldes implicit af kompilatoren, når et objekt i klassen oprettes. Dette skaber et objekt på en stak.
- Eksplicit opkald: Når objektet til en klasse oprettes ved hjælp af nyt, kaldes konstruktører eksplicit. Dette skaber normalt et objekt på en bunke.
Eksempel:
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) Hvad er en COPY CONSTRUCTOR, og hvornår kaldes den?
Svar: En kopikonstruktør er en konstruktør, der accepterer et objekt af samme klasse som dets parameter og kopierer dets datamedlemmer til objektet til venstre i opgaven. Det er nyttigt, når vi har brug for at konstruere et nyt objekt af samme klasse.
Eksempel:
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 }
Spørgsmål nr. 43) Hvad er en standardkonstruktør?
Svar: Standardkonstruktør er en konstruktør, der enten ikke har nogen argumenter, eller hvis der er nogen, så er alle standardargumenter.
Eksempel:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q # 44) Hvad er en Conversion Constructor?
Svar: Det er en konstruktør, der accepterer et argument af en anden type. Konverteringskonstruktører bruges hovedsageligt til konvertering fra en type til en anden.
Spørgsmål nr. 45) Hvad er en eksplicit konstruktør?
Svar: En konverteringskonstruktør erklæres med det eksplicitte nøgleord. Compileren bruger ikke en eksplicit konstruktør til at implementere en underforstået konvertering af typer. Dens formål er forbeholdt eksplicit til byggeri.
Spørgsmål nr. 46) Hvilken rolle spiller det statiske nøgleord for en klassemedlemsvariabel?
Svar: Den statiske medlemsvariabel deler en fælles hukommelse på tværs af alle objekter, der er oprettet for den respektive klasse. Vi behøver ikke henvise til den statiske medlemsvariabel ved hjælp af et objekt. Det kan dog tilgås ved hjælp af selve klassens navn.
Q # 47) Forklar funktionen Statisk medlem.
Svar: En statisk medlemsfunktion kan kun få adgang til klassens statiske medlemsvariabel. Samme som de statiske medlemsvariabler, en statisk medlemsfunktion kan også fås ved hjælp af klassens navn.
Spørgsmål nr. 48) Hvad er rækkefølgen, hvor de lokale objekter destrueres?
Svar: Overvej at følge et stykke kode:
Class A{ …. }; int main() { A a; A b; ... }
I hovedfunktionen har vi to objekter oprettet efter hinanden. De oprettes i rækkefølge, først a derefter b. Men når disse objekter slettes, eller hvis de går ud af omfanget, vil destruktoren for hver blive kaldt i den omvendte rækkefølge, som de blev konstrueret i.
Derfor kaldes destruktoren for b først efterfulgt af a. Selv hvis vi har en række objekter, destrueres de på samme måde i omvendt rækkefølge af deres oprettelse.
Overbelastning
Q # 49) Forklar funktionsoverbelastning og operatøroverbelastning.
Svar: C ++ understøtter OOP-konceptet polymorfisme, som betyder “mange former”.
I C ++ har vi to typer polymorfisme, dvs. kompil-time polymorfisme og run-time polymorfisme. Kompileringstidspolymorfisme opnås ved hjælp af en overbelastningsteknik. Overbelastning betyder simpelthen at give en enhed yderligere betydning ved at holde dens grundlæggende betydning intakt.
C ++ understøtter to typer overbelastning:
Funktion Overbelastning:
Funktionsoverbelastning er en teknik, der gør det muligt for programmøren at have mere end en funktion med det samme navn, men en anden parameterliste. Med andre ord overbelaster vi funktionen med forskellige argumenter, dvs. det være sig typen af argumenter, antallet af argumenter eller rækkefølgen af argumenterne.
Funktionsoverbelastning opnås aldrig på sin returtype.
Operatør Overbelastning:
Dette er endnu en anden type kompileringstidspolymorfisme, der understøttes af C ++. I operatøroverbelastning er en operatør overbelastet, så den også kan fungere på de brugerdefinerede typer med operanderne af standarddatatypen. Men mens du gør dette, holdes standarddefinitionen for denne operatør intakt.
For eksempel, en tilføjelsesoperator (+), der fungerer på numeriske datatyper, kan overbelastes til at fungere på to objekter ligesom et objekt i kompleks antal klasse.
Q # 50) Hvad er forskellen mellem metodeoverbelastning og metodeoverstyring i C ++?
Svar: Metodeoverbelastning har funktioner med samme navn, men forskellige argumentlister. Dette er en form for kompileringstidspolymorfisme.
Metodeoverstyring kommer i billedet, når vi omskriver metoden, der er afledt af en basisklasse. Metodeoverstyring bruges, når man beskæftiger sig med run-time polymorfisme eller virtuelle funktioner.
Q # 51) Hvad er forskellen mellem en Copy Constructor og en Overloaded Opdragsoperatør?
Svar: En kopikonstruktør og en overbelastet opgaveoperatør tjener grundlæggende det samme formål, dvs. at tildele indholdet af et objekt til et andet. Men der er stadig en forskel mellem de to.
Eksempel:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
I ovenstående eksempel er den anden sætning c1 = c2 en overbelastet tildelingserklæring.
Her er både c1 og c2 allerede eksisterende objekter, og indholdet af c2 tildeles objektet c1. Derfor skal begge objekter allerede oprettes for overbelastet opgaveerklæring.
Næste sætning, kompleks c3 = c2 er et eksempel på kopikonstruktøren. Her tildeles indholdet af c2 til et nyt objekt c3, hvilket betyder, at kopikonstruktøren opretter et nyt objekt hver gang det udføres.
Q # 52) Navngiv de operatører, der ikke kan overbelastes.
Svar:
- sizeof - størrelse af operatør
- . - Punktoperatør
- . * - dereferferenceoperatør
- -> - medlem derferferenceoperatør
- :: - operator til omfangsopløsning
- ?: - betinget operatør
Q # 53) Funktionen kan overbelastes baseret på den parameter, der er en værdi eller en reference. Forklar, om udsagnet er sandt.
Svar: Falsk. Både Passing by value og Passing by reference ser identisk ud til den, der ringer op.
Spørgsmål nr. 54) Hvad er fordelene ved operatøroverbelastning?
Svar: Ved at overbelaste standardoperatører på en klasse kan vi udvide betydningen af disse operatører, så de også kan fungere på de andre brugerdefinerede objekter.
Funktionsoverbelastning giver os mulighed for at reducere kodens kompleksitet og gøre den mere klar og læsbar, da vi kan have de samme funktionsnavne med forskellige argumentlister.
Arv
Spørgsmål nr. 55) Hvad er arv?
Svar: Arv er en proces, hvor vi kan tilegne sig en eksisterende enheds egenskaber og danne en ny enhed ved at tilføje flere funktioner til den.
Med hensyn til C ++ er arv at skabe en ny klasse ved at aflede den fra en eksisterende klasse, så denne nye klasse har egenskaberne til sin overordnede klasse såvel som sin egen.
Spørgsmål nr. 56) Hvad er fordelene ved arv?
Svar: Arv giver mulighed for genbrug af koder, hvilket sparer tid på kodeudvikling.
Ved at arve bruger vi en fejlfri software af høj kvalitet, der reducerer fremtidige problemer.
Q # 57) Understøtter C ++ multilevel og flere arv?
Svar: Ja.
Spørgsmål nr. 58) Hvad er flere arvinger (virtuel arv)? Hvad er dens fordele og ulemper?
Svar: I flere arvninger har vi mere end én baseklasser, hvorfra en afledt klasse kan arve. Derfor tager en afledt klasse funktionerne og egenskaberne i mere end en basisklasse.
For eksempel , en klasse chauffør vil have to baseklasser, nemlig medarbejder og en person, fordi en chauffør er såvel en medarbejder som en person. Dette er fordelagtigt, fordi førerklassen kan arve medarbejdernes egenskaber såvel som personklassen.
Men i tilfælde af en medarbejder og en person vil klassen have nogle egenskaber til fælles. En tvetydig situation vil dog opstå, da førerklassen ikke kender de klasser, som de fælles egenskaber skal arves fra. Dette er den største ulempe ved flere arvinger.
Spørgsmål nr. 59) Forklar klasseforholdet mellem ISA og HASA. Hvordan ville du implementere hver?
Svar: 'ISA' -forholdet udviser normalt arv, da det antyder, at en klasse 'ISA' specialversion af en anden klasse. For eksempel , En ISA-medarbejder. Det betyder, at en medarbejderklasse arves fra personklassen.
I modsætning til “ISA” viser “HASA” -forholdet, at en enhed kan have en anden enhed som dens medlem, eller at en klasse har et andet objekt indlejret i sig.
Så hvis vi tager det samme eksempel på en medarbejderklasse, er den måde, hvorpå vi forbinder lønklassen med medarbejderen, ikke ved at arve den, men ved at inkludere eller indeholde lønobjektet i medarbejderklassen. 'HASA' -forholdet vises bedst ved indeslutning eller sammenlægning.
Spørgsmål nr. 60) Arver en afledt klasse eller arver den ikke?
Svar: Når en afledt klasse er konstrueret fra en bestemt basisklasse, arver den dybest set alle funktionerne og almindelige medlemmer af basisklassen. Men der er nogle undtagelser fra denne regel. For eksempel arver en afledt klasse ikke baseklassens konstruktører og destruktorer.
Hver klasse har sine egne konstruktører og destruktører. Den afledte klasse arver heller ikke tildelingsoperatøren til baseklassen og klassens venner. Årsagen er, at disse enheder er specifikke for en bestemt klasse, og hvis en anden klasse er afledt, eller hvis det er den klasses ven, så kan de ikke overføres til dem.
Polymorfisme
Spørgsmål nr. 61) Hvad er polymorfisme?
Svar: Grundideen bag polymorfisme er i mange former. I C ++ har vi to typer polymorfisme:
(i) Kompileringstidspolymorfisme
I kompileringstidspolymorfisme opnår vi mange former ved overbelastning. Derfor har vi en operatøroverbelastning og funktionsoverbelastning. (Vi har allerede dækket dette ovenfor)
(ii) Kørselstidspolymorfisme
Dette er polymorfismen for klasser og objekter. Generel idé er, at en basisklasse kan arves af flere klasser. En basisklassemarkør kan pege på sin underordnede klasse, og en basisklassearray kan gemme forskellige underordnede klasseobjekter.
Dette betyder, at et objekt reagerer forskelligt på det samme funktionsopkald. Denne type polymorfisme kan bruge en virtuel funktionsmekanisme.
Q # 62) Hvad er virtuelle funktioner?
Svar: En virtuel funktion gør det muligt for de afledte klasser at erstatte implementeringen fra basisklassen.
Når vi har funktioner med samme navn i basen såvel som den afledte klasse, opstår der en tvetydighed, når vi forsøger at få adgang til underordnet klasseobjekt ved hjælp af en basisklassemarkør. Da vi bruger en basisklassemarkør, er den funktion, der kaldes, baseklassefunktionen med samme navn.
For at rette op på denne tvetydighed bruger vi nøgleordet 'virtuel' før funktionsprototypen i basisklassen. Med andre ord gør vi denne polymorfe funktion virtuel. Ved at bruge en virtuel funktion kan vi fjerne tvetydigheden, og vi kan få adgang til alle børneklassefunktionerne korrekt ved hjælp af en basisklassemarkør.
Q # 63) Giv et eksempel på run-time polymorfisme / virtuelle funktioner.
Svar:
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; coutI ovenstående kode har SHAPE-klassen en ren virtuel funktion og er en abstrakt klasse (kan ikke instantieres). Hver klasse stammer fra SHAPE, der implementerer Draw () -funktionen på sin egen måde.
Desuden er hver tegnefunktion virtuel, så når vi bruger en basisklassemarkør (SHAPE) hver gang med objektet fra de afledte klasser (Cirkel og SQUARE), kaldes passende tegnefunktioner.
Spørgsmål nr. 64) Hvad mener du med rene virtuelle funktioner?
Svar: En ren virtuel medlemsfunktion er en medlemsfunktion, hvor basisklassen tvinger de afledte klasser til at tilsidesætte. Normalt har denne medlemsfunktion ingen implementering. Rene virtuelle funktioner er lig med nul.
Eksempel:
class Shape { public: virtual void draw() = 0; };
Baseklasse, der har en ren virtuel funktion som medlem, kan betegnes som en 'abstrakt klasse'. Denne klasse kan ikke instantieres, og den fungerer normalt som en plan, der har flere underklasser med yderligere implementering.
Spørgsmål nr. 65) Hvad er virtuelle konstruktører / destruktører?
Svar:
Virtuelle destruktører: Når vi bruger en basisklassemarkør, der peger på et afledt klasseobjekt og bruger det til at ødelægge det, kaldes destruktoren for baseklassen i stedet for at kalde den afledte klassedestruktor.
Eksempel:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Som vist i ovenstående eksempel kaldes destruktoren, når vi siger slette a, men det er faktisk basisklassedestruktøren. Dette giver anledning til tvetydighed om, at al hukommelse, der er indeholdt i b, ikke ryddes korrekt.
Dette problem kan løses ved hjælp af 'Virtual Destructor' -konceptet.
Hvad vi gør er, at vi gør baseklassekonstruktøren til 'Virtuel', så alle underordnede klassedestruktører også bliver virtuelle, og når vi sletter objektet fra baseklassen, der peger på objektet fra den afledte klasse, kaldes den relevante destruktor, og alt objekterne slettes korrekt.
Dette vises som følger:
vanilla world of warcraft privat server
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Virtuel bygherre : Konstruktører kan ikke være virtuelle. At erklære en konstruktør som en virtuel funktion er en syntaksfejl.
Ven
Q # 66) Hvad er en venfunktion?
Svar: C ++ klasse tillader ikke adgang til sine private og beskyttede medlemmer uden for klassen. Men denne regel kan overtrædes ved at bruge ' Ven ”Funktion.
Som navnet selv antyder, er venfunktion en ekstern funktion, der er en ven af klassen. For at venfunktionen kan få adgang til klassens private og beskyttede metoder, skal vi have en prototype af venfunktionen med nøgleordet 'ven' inkluderet i klassen.
Spørgsmål nr. 67) Hvad er en vensklasse?
Svar: Venneklasser bruges, når vi har brug for at tilsidesætte reglen for private og beskyttede adgangsspecifikatorer, så to klasser kan arbejde tæt sammen.
Derfor kan vi have en venklasse for at være en ven af en anden klasse. På denne måde kan venneklasser holde private, utilgængelige ting, som de er.
Når vi har et krav om at få adgang til den interne implementering af en klasse (privat medlem) uden at udsætte detaljerne ved at offentliggøre, går vi efter venfunktioner.
Avanceret C ++
Skabeloner
Spørgsmål nr. 68) Hvad er en skabelon?
Svar: Skabeloner tillader oprettelse af funktioner, der er uafhængige af datatypen (generisk) og kan tage enhver datatype som parametre og returnere værdi uden at skulle overbelaste funktionen med alle mulige datatyper. Skabeloner opfylder næsten funktionaliteten i en makro.
Dens prototype er en af følgende:
skabelon identificere > funktionsdeklaration;
skabelon identificere > funktionsdeklaration;
Den eneste forskel mellem begge prototyperne er brugen af nøgleordsklasse eller typenavn. Deres grundlæggende funktionalitet ved at være generisk forbliver den samme.
Undtagelse Håndtering
Spørgsmål nr. 69) Hvad er undtagelseshåndtering? Understøtter C ++ undtagelseshåndtering?
Svar: Ja C ++ understøtter undtagelseshåndtering.
Vi kan ikke sikre, at koden altid udføres normalt. Der kan være visse situationer, der kan tvinge den kode, som vi har skrevet, til at fungere, selvom den er fejlfri. Denne fejlfunktion af kode kaldes Undtagelse .
Når en undtagelse er sket, skal compileren kaste den, så vi ved, at der er sket en undtagelse. Når en undtagelse er blevet kastet, skal compileren sikre, at den håndteres korrekt, så programgennemstrømningen fortsætter eller afsluttes ordentligt. Dette kaldes håndtering af en undtagelse.
Således har vi i C ++ tre nøgleord, dvs. prøve , kaste og fangst som er i undtagelseshåndtering.
Den generelle syntaks for undtagelsesblok er:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Som vist ovenfor placeres den kode, der muligvis ikke fungerer korrekt, under prøveblokken. Når kode ikke fungerer, smides en undtagelse. Denne undtagelse fanges derefter under fangstblokken og håndteres, dvs. der træffes passende handlinger.
Spørgsmål nr. 70) Kommentar til C ++ - standardundtagelser?
Svar: C ++ understøtter nogle standardundtagelser, der kan fanges, hvis vi sætter koden inde i prøveblokken. Disse undtagelser er en del af basisklassen “ std :: undtagelse ”. Denne klasse er defineret i C ++ header-filen.
Få eksempler på undtagelser, der understøttes af denne klasse, inkluderer:
bad_alloc - kastet af 'ny'
runtime_error - kastet for runtime fejl
bad_typeid - kastet efter type-id
Introduktion til standardskabelonbiblioteket
Spørgsmål nr. 71) Hvad er et standardskabelonbibliotek (STL)? Hvad er de forskellige typer STL-containere?
Svar: Et standardskabelonbibliotek (STL) er et bibliotek med containerskabeloner, der er godkendt af ANSI-udvalget til inkludering i standard C ++ - specifikationen. Vi har forskellige typer STL-containere afhængigt af hvordan de opbevarer elementerne.
- Kø, stak - Disse er de samme som traditionel kø og stak og kaldes adaptive containere.
- Indstil, kort - Disse er dybest set containere, der har nøgle / værdipar og er associerende.
- Vector og - Disse er sekventielle og har ligheder med arrays.
Q # 72) Hvad er en Iterator-klasse?
Svar: I C ++ er en containerklasse en samling af forskellige objekter.
Hvis vi har brug for at krydse denne samling af objekter, kan vi ikke gøre det ved hjælp af enkle indeksvariabler. Derfor har vi en speciel klasse i STL kaldet en Iterator klasse, som kan bruges til at gennemgå indholdet af containerklassen.
De forskellige kategorier af iteratorer inkluderer input iteratorer, output iteratorer, forward iteratorer, tovejs iteratorer, tilfældig adgang osv.
Q # 73) Hvad er forskellen mellem en ekstern Iterator og en Intern Iterator? Beskriv en fordel ved den eksterne Iterator.
Svar: En intern iterator implementeres med medlemsfunktioner i klassen, der har elementer at gå igennem.
En ekstern iterator er implementeret som en separat klasse, der kan bindes til det objekt, der har elementer at gå igennem. Den grundlæggende fordel ved en ekstern iterator er, at den er let at implementere, da den implementeres som en separat klasse.
For det andet, da det er en anden klasse, kan mange iteratorobjekter være aktive samtidigt.
Yderligere læsning => C # Interviewspørgsmål
Konklusion
Næsten alle de vigtigste kodnings- og programmeringsemner i C ++ -interview er dækket af denne artikel.
Vi håber, at enhver kandidat vil føle sig afslappet efter at have forberedt sig på et interview ved hjælp af denne række interviewspørgsmål.
Alt det bedste til dit interview !!
Anbefalet læsning
- Interviewspørgsmål og svar
- ETL Testing Interview Spørgsmål og svar
- Nogle vanskelige manuelle testspørgsmål og svar
- 25 bedste spørgsmål om svar på Agile Testing Interview og svar
- Spock Interview-spørgsmål med svar (mest populære)
- Nogle interessante spørgsmål om software-test Interview
- Top 20+ .NET Interview Spørgsmål og svar
- Top 32 Bedste Datastage Interview Spørgsmål og svar