top 70 c interview questions
Najczęściej zadawane podstawowe i zaawansowane pytania do rozmów kwalifikacyjnych w języku C ++ z przykładami kodu dla początkujących kandydatów oraz doświadczonych specjalistów:
Ten szczegółowy artykuł z pewnością będzie zakładką dla tych, którzy przygotowują się do rozmowy kwalifikacyjnej w C ++.
Omówiono tutaj prawie wszystkie główne tematy w C ++, a także kilka podstawowych pytań dotyczących zaawansowanych tematów, takich jak biblioteka szablonów standardowych (STL) itp.
Ten zestaw pytań dotyczących kodowania w C ++ pomoże Ci pewnie stawić czoła każdej rozmowie kwalifikacyjnej w C ++ i pomyślnie ją rozwiązać za pierwszym razem.
Czego się nauczysz:
- Pytania do wywiadu C ++ z przykładami kodu
Pytania do wywiadu C ++ z przykładami kodu
Poniżej wymienione są najpopularniejsze pytania do wywiadów z zakresu programowania w C ++, na które odpowiada ekspert C ++.
Przeczytaj także => Najpopularniejsze pytania do wywiadów z programowaniem C.
Podstawowy C ++
Struktura programu w C ++
Pytanie 1) Jaka jest podstawowa struktura programu w C ++?
Odpowiedź: Poniżej przedstawiono podstawową strukturę programu w C ++:
#include int main() { cout<<”Hello,World!”; return 0; }
Pierwsza linia zaczynająca się od „ # ' jest dyrektywa preprocesora . W tym przypadku używamy zawierać jako dyrektywa, która mówi kompilatorowi, aby dołączył nagłówek, podczas gdy „ iostream.h ”, Który będzie używany jako podstawowe wejście / wyjście w dalszej części programu.
Następny wiersz to funkcja „main”, która zwraca liczbę całkowitą. Główną funkcją jest punkt początkowy wykonywania dowolnego programu w języku C ++. Niezależnie od jej pozycji w pliku kodu źródłowego, zawartość funkcji głównej jest zawsze wykonywana jako pierwsza przez kompilator C ++.
W następnym wierszu widzimy otwarte nawiasy klamrowe, które wskazują początek bloku kodu. Następnie widzimy instrukcję programowania lub wiersz kodu, który używa licznika będącego standardowym strumieniem wyjściowym (jego definicja znajduje się w iostream.h).
Ten strumień wyjściowy pobiera ciąg znaków i drukuje go na standardowym urządzeniu wyjściowym. W tym przypadku jest to „Hello, World!”. Zwróć uwagę, że każda instrukcja C ++ kończy się średnikiem (;), co jest bardzo potrzebne, a jego pominięcie spowoduje błędy kompilacji.
Przed zamknięciem nawiasów} widzimy kolejny wiersz „return 0;”. To jest punkt powrotu do głównej funkcji.
Każdy program w C ++ będzie miał podstawową strukturę, jak pokazano powyżej, z dyrektywą preprocesora, deklaracją funkcji głównej, po której następuje blok kodu, a następnie punkt powrotu do funkcji głównej, co wskazuje na pomyślne wykonanie programu.
Pytanie 2) Jakie są komentarze w C ++?
Odpowiedź: Komentarze w C ++ to po prostu fragment kodu źródłowego ignorowany przez kompilator. Są one pomocne tylko dla programisty w celu dodania opisu lub dodatkowych informacji o kodzie źródłowym.
W C ++ są dwa sposoby dodawania komentarzy:
- // komentarz jednowierszowy
- / * blokuj komentarz * /
Pierwszy typ odrzuci wszystko po napotkaniu przez kompilator „//”. W drugim typie kompilator odrzuca wszystko między „/ *” a „* /”.
Zmienne, typy danych i stałe
Q # 3) Różnica między deklaracją a definicją zmiennej.
Odpowiedź: Deklaracja zmiennej polega jedynie na określeniu typu danych zmiennej i nazwy zmiennej. W wyniku deklaracji informujemy kompilator, aby zarezerwował miejsce na zmienną w pamięci zgodnie z określonym typem danych.
Przykład:
int Result; char c; int a,b,c;
Wszystkie powyższe są ważnymi deklaracjami. Zwróć również uwagę, że w wyniku deklaracji wartość zmiennej jest nieokreślona.
Natomiast definicja jest implementacją / instancją zadeklarowanej zmiennej, w której przywiązujemy odpowiednią wartość do zadeklarowanej zmiennej tak, aby linker mógł łączyć odniesienia do odpowiednich podmiotów.
Z góry Przykład ,
Wynik = 10;
C = „A”;
To są ważne definicje.
Q # 4) Skomentuj lokalny i globalny zakres zmiennej.
Odpowiedź: Zakres zmiennej definiuje się jako zakres kodu programu, w którym zmienna pozostaje aktywna, tj. Można ją zadeklarować, zdefiniować lub z nią pracować.
W C ++ istnieją dwa typy zakresów:
- Zakres lokalny: Mówi się, że zmienna ma zasięg lokalny lub jest lokalna, gdy jest zadeklarowana wewnątrz bloku kodu. Zmienna pozostaje aktywna tylko wewnątrz bloku i nie jest dostępna poza blokiem kodu.
- Zakres globalny: Zmienna ma zasięg globalny, gdy jest dostępna w całym programie. Zmienna globalna jest deklarowana w górnej części programu przed wszystkimi definicjami funkcji.
Przykład:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
P # 5) Jaki jest priorytet, jeśli w programie występuje zmienna globalna i zmienna lokalna o tej samej nazwie?
Odpowiedź: Zawsze, gdy istnieje zmienna lokalna o takiej samej nazwie, jak zmienna globalna, kompilator daje pierwszeństwo zmiennej lokalnej.
Przykład:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Wynik powyższego kodu to 5. Dzieje się tak, ponieważ chociaż obie zmienne mają tę samą nazwę, kompilator nadał pierwszeństwo zakresowi lokalnemu.
P # 6) Kiedy istnieje zmienna globalna i zmienna lokalna o tej samej nazwie, w jaki sposób uzyskasz dostęp do zmiennej globalnej?
Odpowiedź: Gdy istnieją dwie zmienne o tej samej nazwie, ale różnym zakresie, tj. Jedna jest zmienną lokalną, a druga zmienną globalną, kompilator da pierwszeństwo zmiennej lokalnej.
Aby uzyskać dostęp do zmiennej globalnej, używamy „ operator rozpoznawania zakresu (: :) ”. Korzystając z tego operatora, możemy uzyskać dostęp do wartości zmiennej globalnej.
Przykład:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Wynik:
Zmienna globalna x = 10
zmienna lokalna x = 2
P # 7) Na ile sposobów można zainicjować int za pomocą stałej?
Odpowiedź: Istnieją dwa sposoby:
- Pierwszy format wykorzystuje tradycyjną notację C.
int wynik = 10; - Drugi format używa notacji konstruktora.
int wynik (10);
Stałe
P # 8) Co to jest stała? Wyjaśnij na przykładzie.
Odpowiedź: Stała to wyrażenie o stałej wartości. W zależności od typu danych można je podzielić na stałe całkowite, dziesiętne, zmiennoprzecinkowe, znakowe lub łańcuchowe.
Oprócz liczby dziesiętnej C ++ obsługuje również dwie dodatkowe stałe, tj. Ósemkowe (do podstawy 8) i szesnastkowe (do podstawy 16).
Przykłady stałych:
- 75 // liczba całkowita (dziesiętna)
- 0113 // ósemkowo
- 0x4b // szesnastkowo
- 3.142 // zmiennoprzecinkowe
- „C” // stała znakowa
- „Hello, World” // ciąg znaków
Uwaga: Kiedy musimy przedstawić pojedynczy znak, używamy apostrofów, a gdy chcemy zdefiniować stałą składającą się z więcej niż jednego znaku, używamy cudzysłowów.
P # 9) Jak definiujesz / deklarujesz stałe w C ++?
Odpowiedź: W C ++ możemy definiować własne stałe za pomocą #definiować dyrektywa preprocesora.
#define Wartość identyfikatora
Przykład:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Wynik: Powierzchnia koła = 78,55
Jak pokazano w powyższym przykładzie, po zdefiniowaniu stałej za pomocą dyrektywy #define możemy jej używać w całym programie i podstawiać jej wartość.
Możemy zadeklarować stałe w C ++ przy użyciu „ konst ”Słowo kluczowe. Ten sposób jest podobny do deklarowania zmiennej, ale z prefiksem const.
Przykłady deklarowania stałej
const int pi = 3,142;
const char c = „sth”;
const zipcode = 411014;
W powyższych przykładach, ilekroć typ stałej nie jest określony, kompilator C ++ ustawia go domyślnie na typ całkowity.
Operatorzy
Q # 10) Skomentuj operator przypisania w C ++.
Odpowiedź: Operator przypisania w C ++ służy do przypisywania wartości do innej zmiennej.
a = 5;
Ten wiersz kodu przypisuje wartość całkowitą 5 do zmiennej do .
Część po lewej stronie operatora = jest znana jako lwartość (wartość po lewej) i po prawej jako wartość r (prawidłowa wartość). L wartość musi zawsze być zmienną, podczas gdy prawa strona może być stałą, zmienną, wynikiem operacji lub ich kombinacją.
Operacja przypisania zawsze odbywa się od prawej do lewej i nigdy odwrotnie.
Jedną właściwością, którą C ++ ma w stosunku do innych języków programowania, jest to, że operator przypisania może być używany jako wartość r (lub część pliku wartość r ) do innego zadania.
Przykład:
a = 2 + (b = 5);
jest równa:
b = 5;
a = 2 + b;
Co oznacza, najpierw przydziel 5 do zmiennej b a następnie przypisz do do, wartość dwa plus wynik poprzedniego wyrażenia b (czyli 5), odchodzi do z ostateczną wartością 7 .
W związku z tym następujące wyrażenie jest również prawidłowe w C ++:
a = b = c = 5;
przypisz 5 do zmiennych do , b i do .
P # 11) Jaka jest różnica między równe (==) a operatorem przypisania (=)?
Odpowiedź: W C ++ równe (==) i operator przypisania (=) to dwa zupełnie różne operatory.
Równe (==) jest operatorem relacyjnym równości, który ocenia dwa wyrażenia, aby sprawdzić, czy są równe, i zwraca prawdę, jeśli są równe, i fałsz, jeśli nie są.
Operator przypisania (=) służy do przypisywania wartości do zmiennej. Dlatego możemy mieć złożoną operację przypisania wewnątrz relacyjnego operatora równości do oceny.
P # 12) Jakie są różne operatory arytmetyczne w C ++?
Odpowiedź: C ++ obsługuje następujące operatory arytmetyczne:
- + dodatek
- - odejmowanie
- * mnożenie
- / podział
- % module
Zademonstrujmy różne operatory arytmetyczne za pomocą następującego fragmentu kodu.
Przykład:
#include int main () { int a=5, b=3; cout<<”a + b = “< Wynik :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Jak pokazano powyżej, wszystkie inne operacje są proste i takie same jak rzeczywiste operacje arytmetyczne, z wyjątkiem operatora modulo, który jest zupełnie inny. Operator modulo dzieli a i b, a wynikiem operacji jest reszta dzielenia.
P # 13) Jakie są różne operatory przypisania złożonego w C ++?
Odpowiedź: Poniżej znajdują się operatory przypisania złożone w C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
Operator przypisania złożonego to jedna z najważniejszych cech języka C ++, która pozwala na zmianę wartości zmiennej jednym z podstawowych operatorów:
Przykład:
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;
P # 14) Określić różnicę między operacjami przyrostu / obniżenia przed i po.
Odpowiedź: C ++ pozwala na użycie dwóch operatorów, tj. ++ (inkrementacja) i - (dekrementacja), które pozwalają odpowiednio dodać 1 do istniejącej wartości zmiennej i odjąć 1 od zmiennej. Te operatory są z kolei nazywane inkrementacją (++) i dekrementacją (-).
Przykład:
a = 5;
a ++;
Druga instrukcja, a ++, spowoduje dodanie 1 do wartości a. Zatem ++ jest równoważne
a = a + 1; lub
a + = 1;
Unikalną cechą tych operatorów jest to, że możemy poprzedzić lub sufiksować te operatory zmienną. Stąd, jeśli a jest zmienną i poprzedzamy operator inkrementacji, to będzie
++ a;
Nazywa się to preinkrementacją. Podobnie mamy również pre-dekrementację.
Jeśli poprzedzimy zmienną a operatorem przyrostu, otrzymamy,
a ++;
To jest post-inkrementacja. Podobnie mamy też post-dekrementację.
Różnica między znaczeniem pre i post zależy od tego, jak wyrażenie jest oceniane, a wynik jest przechowywany.
W przypadku operatora preinkrementacji / dekrementacji najpierw wykonywana jest operacja inkrementacji / dekrementacji, a następnie wynik przekazywany do lwartości. Podczas gdy dla operacji postinkrementacyjnych / dekrementacyjnych, wartość l jest obliczana jako pierwsza, a następnie odpowiednio zwiększana / zmniejszana.
Przykład:
a = 5; b = 6;
++ a; # a = 6
b-; # b = 6
-za; # a = 5
b ++; # 6
I / O przez konsolę
P # 15) Jakie są operatory wyodrębniania i wstawiania w C ++? Wyjaśnij przykładami.
Odpowiedź: W bibliotece iostream.h języka C ++, Chiny , i koszt to dwa strumienie danych, które są używane odpowiednio jako wejście i wyjście. Cout jest zwykle kierowane na ekran, a do klawiatury przypisywane jest cin.
„Cin” (operator ekstrakcji): Używając przeciążonego operatora >> ze strumieniem cin, C ++ obsługuje standardowe wejście.
int age; cin>>age;
Jak pokazano w powyższym przykładzie, deklarowana jest zmienna całkowita „wiek”, a następnie czeka na wprowadzenie danych przez cin (klawiatura). „Cin” przetwarza dane wejściowe tylko po naciśnięciu klawisza RETURN.
„Cout” (operator wstawiania): Jest to używane w połączeniu z przeciążeniem<< operator. It directs the data that followed it into the cout stream.
Przykład:
główne różnice między java i c ++
cout<<”Hello, World!”; cout<<123;
Struktury i funkcje sterowania
Struktury kontrolne i pętle
P # 16) Jaka jest różnica między pętlą while i do while? Wyjaśnij przykładami.
Odpowiedź: Format pętli while w C ++ to:
While (wyrażenie)
{sprawozdania;}
Blok instrukcji pod while jest wykonywany tak długo, jak długo warunek w danym wyrażeniu jest prawdziwy.
lista przylegania wykresów ważonych c ++
Przykład:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<W powyższym kodzie pętla wyjdzie bezpośrednio, jeśli n wynosi 0. Tak więc w pętli while warunek kończący znajduje się na początku pętli, a jeśli jest spełniony, żadne iteracje pętli nie są wykonywane.
Następnie rozważymy pętlę do-while.
Ogólny format do-while to:
do {instrukcja;} while (warunek);
Przykład:
#include int main() { int n; cout<>n; do { cout<W powyższym kodzie widzimy, że instrukcja wewnątrz pętli jest wykonywana co najmniej raz, ponieważ warunek pętli jest na końcu. To są główne różnice między while i do-while.
W przypadku pętli while możemy bezpośrednio wyjść z pętli na początku, jeśli warunek nie jest spełniony, natomiast w pętli do-while wykonujemy instrukcje pętli co najmniej raz.
Funkcje
P # 17) Co rozumiesz przez typ zwrotu „void”?
Odpowiedź: Wszystkie funkcje powinny zwracać wartość zgodnie z ogólną składnią.
Jednak w przypadku, gdy nie chcemy, aby funkcja zwracała jakąkolwiek wartość, używamy „ unieważnić ”, Aby to wskazać. Oznacza to, że używamy „ unieważnić ”, Aby wskazać, że funkcja nie zwraca wartości lub zwraca„ unieważnić ”.
Przykład:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 18) Wyjaśnij Przekaż przez wartość i Przekaż przez odniesienie.
Odpowiedź: Podczas przekazywania parametrów do funkcji za pomocą „Przekaż przez wartość”, przekazujemy kopię parametrów do funkcji.
W związku z tym wszelkie modyfikacje parametrów wywoływanej funkcji nie są przekazywane z powrotem do funkcji wywołującej. Zatem zmienne w funkcji wywołującej pozostają niezmienione.
Przykład:
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 = “< Wynik:
x = 1
y = 3
z=4
Jak widać powyżej, chociaż parametry zostały zmienione w wywołanej funkcji, ich wartości nie zostały odzwierciedlone w funkcji wywołującej, ponieważ były przekazywane przez wartość.
Jeśli jednak chcemy uzyskać zmienione wartości z funkcji z powrotem do funkcji wywołującej, używamy techniki „Pass by Reference”.
Aby to zademonstrować, zmodyfikujemy powyższy program w następujący sposób:
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 = “< Wynik:
x = 2
y = 6
z=8
Jak pokazano powyżej, modyfikacje parametrów wywoływanych funkcji są przekazywane do funkcji wywołującej, gdy używamy techniki „Przekaż przez referencję”. Dzieje się tak, ponieważ przy użyciu tej techniki nie przekazujemy kopii parametrów, ale w rzeczywistości przekazujemy samo odwołanie do zmiennej.
P # 19) Co to są parametry domyślne? Jak są oceniane w funkcji C ++?
Odpowiedź: Parametr domyślny to wartość przypisywana do każdego parametru podczas deklarowania funkcji.
Ta wartość jest używana, jeśli ten parametr jest pozostawiony pusty podczas wywoływania funkcji. Aby określić wartość domyślną dla konkretnego parametru, po prostu przypisujemy wartość do parametru w deklaracji funkcji.
Jeśli wartość nie zostanie przekazana dla tego parametru podczas wywołania funkcji, kompilator użyje podanej wartości domyślnej. Jeśli określona jest wartość, to ta wartość domyślna jest nadeptywana i używana jest przekazana wartość.
Przykład:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Wynik:
12
6
Jak pokazano w powyższym kodzie, istnieją dwa wywołania funkcji mnożenia. W pierwszym wywołaniu tylko jeden parametr jest przekazywany z wartością. W tym przypadku drugim parametrem jest podana wartość domyślna. Ale w drugim wywołaniu, gdy obie wartości parametrów są przekazywane, wartość domyślna jest zastępowana i używana jest przekazana wartość.
P # 20) Co to jest funkcja Inline w C ++?
Odpowiedź: Funkcja wbudowana to funkcja, która jest kompilowana przez kompilator jako punkt wywołania funkcji, a kod jest w tym miejscu podstawiany. To sprawia, że kompilacja jest szybsza. Ta funkcja jest definiowana przez poprzedzenie prototypu funkcji słowem kluczowym „inline”.
Takie funkcje są korzystne tylko wtedy, gdy kod funkcji wbudowanej jest mały i prosty. Chociaż funkcja jest zdefiniowana jako Inline, jest całkowicie zależna od kompilatora, aby ocenić ją jako wbudowaną lub nie.
Struktura danych zaawansowanych
Tablice
P # 21) Dlaczego tablice są zwykle przetwarzane w pętli for?
Odpowiedź: Array używa indeksu do przechodzenia przez każdy z jej elementów.
Jeśli A jest tablicą, to każdy z jej elementów jest dostępny jako A (i). Programowo wszystko, co jest wymagane, aby to zadziałało, to iteracyjny blok ze zmienną pętli i, która służy jako indeks (licznik) zwiększający się od 0 do A.length-1.
To jest dokładnie to, co robi pętla i to jest powód, dla którego przetwarzamy tablice przy użyciu pętli for.
Pytanie nr 22) Podaj różnicę między operacjami usuwania i usuwania ().
Odpowiedź: „Delete ()” służy do zwolnienia pamięci przydzielonej do tablicy, która została przydzielona za pomocą nowego (). „Usuń” służy do zwolnienia jednego fragmentu pamięci, który został przydzielony przy użyciu nowego.
P # 23) Co jest nie tak z tym kodem?
T * p = nowy T (10);
usuń p;
Odpowiedź: Powyższy kod jest poprawny składniowo i będzie się dobrze kompilował.
Jedynym problemem jest to, że po prostu usunie pierwszy element tablicy. Chociaż cała tablica zostanie usunięta, zostanie wywołany tylko destruktor pierwszego elementu i zwolniona pamięć dla pierwszego elementu.
P # 24) Jaka jest kolejność niszczenia obiektów w tablicy?
Odpowiedź: Obiekty w tablicy są niszczone w odwrotnej kolejności: najpierw skonstruowane, ostatnio zniszczone.
W poniższym przykładzie, kolejność destruktorów będzie wynosić a (9), a (8),…, a (1), a (0):
voiduserCode() { Car a(10); ... }
Wskaźniki
Q # 25) Co jest nie tak z tym kodem?
T * p = 0;
usuń p;
Odpowiedź: W powyższym kodzie wskaźnik jest wskaźnikiem zerowym. Zgodnie ze standardem C ++ 03 całkowicie poprawne jest wywołanie funkcji usuwania po wskaźniku NULL. Operator delete zadbałby wewnętrznie o sprawdzenie NULL.
P # 26) Co to jest zmienna referencyjna w C ++?
Odpowiedź: Zmienna odniesienia to nazwa aliasu istniejącej zmiennej. Oznacza to, że zarówno nazwa zmiennej, jak i zmienna odniesienia wskazują na to samo miejsce w pamięci. Dlatego za każdym razem, gdy zmienna jest aktualizowana, aktualizowane jest również odniesienie.
Przykład:
int a=10; int& b = a;
Tutaj b jest odniesieniem do a.
Klasy pamięci
P # 27) Co to jest klasa pamięci masowej? Wspomnij o klasach pamięci w C ++.
Odpowiedź: Klasa pamięci określa żywotność lub zakres symboli, takich jak zmienne lub funkcje.
C ++ obsługuje następujące klasy pamięci:
- Automatyczny
- Statyczny
- Zewnętrzny
- Zarejestrować
- Zmienny
Q # 28) Wyjaśnij specyfikator klasy Mutable Storage.
Odpowiedź: Nie można zmienić zmiennej należącej do obiektu klasy stałej. Jednak deklarując zmienne jako „mutowalne”, możemy zmienić wartości tych zmiennych.
P # 29) Do czego służy słowo kluczowe auto?
Odpowiedź: Domyślnie każda zmienna lokalna funkcji jest automatyczna, tj. automatyczny . W poniższej funkcji obie zmienne „i” i „j” są zmiennymi automatycznymi.
void f() { int i; auto int j; }
UWAGA : Zmienna globalna nie jest zmienną automatyczną.
P # 30) Co to jest zmienna statyczna?
Odpowiedź: Zmienna statyczna to zmienna lokalna, która zachowuje swoją wartość przez wywołania funkcji. Zmienne statyczne deklaruje się za pomocą słowa kluczowego „static”. Zmienne numeryczne, które są statyczne, mają domyślną wartość zero.
Następująca funkcja wypisze 1 2 3, jeśli zostanie wywołana trzykrotnie.
void f() { static int i; ++i; printf(“%d “,i); }
Jeśli zmienna globalna jest statyczna, jej widoczność jest ograniczona do tego samego kodu źródłowego.
P # 31) Jaki jest cel specyfikacji zewnętrznej pamięci masowej?
Odpowiedź: Specyfikator „Extern” służy do rozstrzygania zakresu symbolu globalnego.
#include using nam espace std; main() { extern int i; cout< W powyższym kodzie „i” może być widoczne poza plikiem, w którym jest zdefiniowane.
Q # 32) Wyjaśnij Register Storage Specifier.
Odpowiedź: Zmienną „rejestru” należy używać zawsze, gdy jest używana. Gdy zmienna jest zadeklarowana ze specyfikatorem „rejestru”, kompilator przekazuje rejestr procesora do przechowywania, aby przyspieszyć wyszukiwanie zmiennej.
P # 33) Kiedy używać argumentów odwołania „const” w funkcji?
Odpowiedź: Używanie argumentów odwołania „const” w funkcji jest korzystne z kilku powodów:
- „Const” chroni przed błędami programowania, które mogą zmienić dane.
- W wyniku użycia „const”, funkcja jest w stanie przetwarzać zarówno argumenty stałe, jak i inne niż stałe, co nie jest możliwe, gdy „stała” nie jest używana.
- Użycie odwołania do const umożliwi funkcji wygenerowanie i użycie zmiennej tymczasowej w odpowiedni sposób.
Struktura i typy danych zdefiniowane przez użytkownika
Q # 34) Co to jest klasa?
Odpowiedź: Klasa to typ danych zdefiniowany przez użytkownika w C ++. Można go stworzyć, aby rozwiązać określony rodzaj problemu. Po utworzeniu użytkownik nie musi znać szczegółów działania klasy.
Ogólnie klasa działa jak plan projektu i może zawierać różne parametry i funkcje lub akcje operujące na tych parametrach. Nazywa się to członkami klasy.
Q # 35) Różnica między klasą a strukturą.
Odpowiedź:
Struktura: W języku C struktura jest używana do łączenia razem różnych typów typów danych. Zmienne wewnątrz struktury nazywane są członkami struktury. Te elementy członkowskie są domyślnie publiczne i można uzyskać do nich dostęp, używając nazwy struktury, po której następuje operator kropki, a następnie nazwa elementu członkowskiego.
Klasa: Klasa jest następcą Struktury. C ++ rozszerza definicję struktury o funkcje, które działają na jej elementach członkowskich. Domyślnie wszyscy członkowie klasy są prywatni.
Programowanie obiektowe w C ++
Klasy, konstruktorzy, niszczyciele
P # 36) Co to jest przestrzeń nazw?
Odpowiedź: Przestrzeń nazw pozwala nam zgrupować zestaw globalnych klas, obiektów i / lub funkcji pod określoną nazwą.
Ogólna forma korzystania z przestrzeni nazw to:
identyfikator przestrzeni nazw {namespace-body}
Gdzie identyfikator to dowolny prawidłowy identyfikator, a treść przestrzeni nazw to zestaw klas, obiektów i funkcji, które są zawarte w przestrzeni nazw. Przestrzenie nazw są szczególnie przydatne w przypadku, gdy istnieje możliwość, że więcej niż jeden obiekt będzie miał tę samą nazwę, co spowoduje konflikty nazw.
P # 37) Jakie jest zastosowanie deklaracji „używanie”?
Odpowiedź: Używanie deklaracji służy do odwoływania się do nazwy z przestrzeni nazw bez operatora rozpoznawania zakresu.
Q # 38) Co to jest zmiana nazw?
Odpowiedź: Kompilator C ++ koduje typy parametrów z funkcją / metodą w unikalną nazwę. Ten proces nazywa się zniekształcaniem nazw. Odwrotny proces nazywany jest demanglingiem.
Przykład:
A :: b (int, long) const jest zniekształcone jako „B__C3Ail” .
W przypadku konstruktora nazwa metody jest pomijana.
To jest A :: A (int, long) const jest zniekształcone jako „C3Ail”.
P # 39) Jaka jest różnica między obiektem a klasą?
Odpowiedź: Klasa to plan projektu lub problemu do rozwiązania i składa się ze zmiennych i metod. Nazywa się to członkami klasy. Nie możemy samodzielnie uzyskać dostępu do metod ani zmiennych tej klasy, chyba że są zadeklarowane jako statyczne.
Aby uzyskać dostęp do członków klasy i umożliwić ich użycie, powinniśmy utworzyć instancję klasy, która nazywa się Object. Klasa ma nieograniczony czas życia, podczas gdy obiekt ma tylko ograniczoną żywotność.
P # 40) Jakie są różne specyfikatory dostępu w C ++?
Odpowiedź: C ++ obsługuje następujące specyfikatory dostępu:
- Publiczny: Członkowie danych i funkcje są dostępne poza klasą.
- Prywatny: Członkowie danych i funkcje nie są dostępne poza klasą. Wyjątkiem jest użycie klasy znajomego.
- Chroniony: Składowe danych i funkcje są dostępne tylko dla klas pochodnych.
Przykład:
Opisz PRYWATNE, CHRONIONE i PUBLICZNE wraz z ich różnicami i podaj przykłady.
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) Co to jest Konstruktor i jak się go nazywa?
Odpowiedź: Konstruktor jest funkcją składową klasy mającą taką samą nazwę jak klasa. Służy głównie do inicjowania członków klasy. Domyślnie konstruktory są publiczne.
Istnieją dwa sposoby wywoływania konstruktorów:
- Niejawnie: Konstruktory są niejawnie wywoływane przez kompilator podczas tworzenia obiektu klasy. Tworzy to obiekt na stosie.
- Jawne wywołanie: Gdy obiekt klasy jest tworzony przy użyciu new, konstruktory są wywoływane jawnie. Zwykle tworzy to obiekt na stercie.
Przykład:
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) Co to jest COPY CONSTRUCTOR i kiedy się nazywa?
Odpowiedź: Konstruktor kopiujący to konstruktor, który akceptuje obiekt tej samej klasy co jego parametr i kopiuje jego składowe danych do obiektu po lewej stronie przypisania. Jest to przydatne, gdy potrzebujemy skonstruować nowy obiekt tej samej klasy.
Przykład:
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) Co to jest domyślny konstruktor?
Odpowiedź: Konstruktor domyślny to konstruktor, który albo nie ma żadnych argumentów, albo jeśli takie istnieją, to wszystkie z nich są argumentami domyślnymi.
Przykład:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
P # 44) Co to jest Konstruktor konwersji?
Odpowiedź: Jest to konstruktor, który akceptuje jeden argument innego typu. Konstruktory konwersji są używane głównie do konwersji z jednego typu na inny.
P # 45) Co to jest jawny konstruktor?
Odpowiedź: Konstruktor konwersji jest deklarowany za pomocą słowa kluczowego jawnego. Kompilator nie używa jawnego konstruktora do implementacji niejawnej konwersji typów. Jego cel jest zarezerwowany wyraźnie dla konstrukcji.
P # 46) Jaka jest rola słowa kluczowego Static dla zmiennej składowej klasy?
Odpowiedź: Statyczna zmienna składowa ma wspólną pamięć dla wszystkich obiektów utworzonych dla odpowiedniej klasy. Nie musimy odwoływać się do statycznej zmiennej składowej za pomocą obiektu. Można jednak uzyskać do niego dostęp, używając samej nazwy klasy.
Q # 47) Wyjaśnij statyczną funkcję składową.
Odpowiedź: Statyczna funkcja składowa może uzyskać dostęp tylko do statycznej zmiennej składowej klasy. Tak samo jak statyczne zmienne składowe, dostęp do statycznej funkcji składowej można również uzyskać przy użyciu nazwy klasy.
P # 48) Jaka jest kolejność niszczenia lokalnych obiektów?
Odpowiedź: Rozważ zastosowanie fragmentu kodu:
Class A{ …. }; int main() { A a; A b; ... }
W funkcji głównej mamy dwa obiekty utworzone jeden po drugim. Są tworzone w kolejności, najpierw a potem b. Ale kiedy te obiekty zostaną usunięte lub jeśli wyjdą poza zakres, destruktor każdego z nich zostanie wywołany w odwrotnej kolejności, w jakiej zostały skonstruowane.
Dlatego najpierw zostanie wywołany destruktor b, a po nim a. Nawet jeśli mamy tablicę obiektów, zostaną one zniszczone w ten sam sposób w odwrotnej kolejności do ich powstania.
Przeciążenie
Q # 49) Wyjaśnij przeciążanie funkcji i przeciążanie operatorów.
Odpowiedź: C ++ obsługuje koncepcję OOP Polimorfizm, co oznacza „wiele form”.
W C ++ mamy dwa typy polimorfizmu, tj. Polimorfizm w czasie kompilacji i polimorfizm w czasie wykonywania. Polimorfizm w czasie kompilacji uzyskuje się za pomocą techniki przeciążania. Przeciążanie oznacza po prostu nadawanie dodatkowego znaczenia jednostce poprzez zachowanie jej podstawowego znaczenia w stanie nienaruszonym.
C ++ obsługuje dwa typy przeciążania:
Przeciążanie funkcji:
Przeciążanie funkcji to technika, która pozwala programiście mieć więcej niż jedną funkcję o tej samej nazwie, ale z inną listą parametrów. Innymi słowy, przeciążamy funkcję różnymi argumentami, tj. Czy to typem argumentów, liczbą argumentów, czy też kolejnością argumentów.
Przeciążenie funkcji nigdy nie jest osiągane w zwracanym typie.
Przeciążanie operatorów:
Jest to kolejny typ polimorfizmu w czasie kompilacji obsługiwany przez C ++. W przypadku przeciążenia operatora operator jest przeciążony, dzięki czemu może działać na typach zdefiniowanych przez użytkownika, jak również z operandami standardowego typu danych. Ale robiąc to, standardowa definicja tego operatora pozostaje nienaruszona.
Na przykład, operator dodawania (+), który działa na liczbowych typach danych, może być przeciążony, aby działać na dwóch obiektach, tak jak obiekt o klasie liczb zespolonych.
P # 50) Jaka jest różnica między przeciążaniem metod a zastępowaniem metod w C ++?
Odpowiedź: Przeciążanie metod polega na tym, że mają funkcje o tej samej nazwie, ale z różnymi listami argumentów. Jest to forma polimorfizmu w czasie kompilacji.
Zastępowanie metod pojawia się, gdy przepisujemy metodę pochodzącą z klasy bazowej. Przesłanianie metod jest używane podczas przetwarzania polimorfizmu w czasie wykonywania lub funkcji wirtualnych.
Q # 51) Jaka jest różnica między konstruktorem kopiowania a przeciążeniem Operator przypisania?
Odpowiedź: Konstruktor kopiujący i przeciążony operator przypisania służą zasadniczo temu samemu celowi, tj. Przypisywaniu zawartości jednego obiektu do drugiego. Ale nadal istnieje różnica między tymi dwoma.
Przykład:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
W powyższym przykładzie druga instrukcja c1 = c2 jest przeciążoną instrukcją przypisania.
Tutaj zarówno c1, jak i c2 są już istniejącymi obiektami, a zawartość c2 jest przypisana do obiektu c1. Dlatego w przypadku przeciążonej instrukcji przypisania oba obiekty muszą być już utworzone.
Następna instrukcja złożona c3 = c2 jest przykładem konstruktora kopiującego. Tutaj zawartość c2 jest przypisana do nowego obiektu c3, co oznacza, że konstruktor kopiujący tworzy nowy obiekt za każdym razem, gdy jest wykonywany.
Q # 52) Nazwij operatorów, których nie można Przeciążać.
Odpowiedź:
- sizeof - operator sizeof
- . - operator kropki
- . * - operator wyłuskiwania
- -> - operator wyłuskiwania członków
- :: - operator rozpoznawania zakresu
- ?: - operator warunkowy
Q # 53) Funkcja może być przeciążona na podstawie parametru, który jest wartością lub odniesieniem. Wyjaśnij, czy stwierdzenie jest prawdziwe.
Odpowiedź: Fałszywy. Zarówno przekazywanie przez wartość, jak i przekazywanie przez odwołanie wyglądają identycznie jak obiekt wywołujący.
P # 54) Jakie są zalety przeciążenia operatora?
Odpowiedź: Przeciążając standardowe operatory w klasie, możemy rozszerzyć znaczenie tych operatorów, tak aby mogły również działać na innych obiektach zdefiniowanych przez użytkownika.
Przeciążanie funkcji pozwala nam zmniejszyć złożoność kodu i uczynić go bardziej przejrzystym i czytelnym, ponieważ możemy mieć te same nazwy funkcji z różnymi listami argumentów.
Dziedzictwo
P # 55) Co to jest dziedziczenie?
Odpowiedź: Dziedziczenie to proces, dzięki któremu możemy uzyskać cechy istniejącej jednostki i utworzyć nową, dodając do niej więcej funkcji.
Jeśli chodzi o C ++, dziedziczenie to tworzenie nowej klasy poprzez wyprowadzenie jej z istniejącej klasy, tak aby ta nowa klasa miała właściwości swojej klasy nadrzędnej, a także własne.
P # 56) Jakie są zalety dziedziczenia?
Odpowiedź: Dziedziczenie umożliwia ponowne użycie kodu, oszczędzając w ten sposób czas potrzebny na tworzenie kodu.
Dzięki dziedziczeniu korzystamy z wolnego od błędów oprogramowania wysokiej jakości, które ogranicza przyszłe problemy.
P # 57) Czy C ++ obsługuje dziedziczenie wielopoziomowe i wielokrotne?
Odpowiedź: Tak.
P # 58) Co to jest dziedziczenie wielokrotne (dziedziczenie wirtualne)? Jakie są jego zalety i wady?
Odpowiedź: W przypadku dziedziczenia wielokrotnego mamy więcej niż jedną klasę bazową, z której może dziedziczyć klasa pochodna. W związku z tym klasa pochodna przyjmuje cechy i właściwości więcej niż jednej klasy bazowej.
Na przykład , Klasa kierowca będzie miał dwie klasy bazowe, a mianowicie, pracownik i osoba, ponieważ kierowca jest zarówno pracownikiem, jak i osobą. Jest to korzystne, ponieważ klasa kierowcy może dziedziczyć zarówno właściwości pracownika, jak i klasę osoby.
Ale w przypadku pracownika i osoby klasa będzie miała pewne cechy wspólne. Pojawi się jednak niejednoznaczna sytuacja, ponieważ klasa sterownika nie będzie znała klas, z których powinny być dziedziczone wspólne właściwości. Jest to główna wada wielokrotnego dziedziczenia.
Q # 59) Wyjaśnij relacje klas ISA i HASA. Jak byś wdrożył każdy?
Odpowiedź: Relacja „ISA” zwykle wykazuje dziedziczenie, ponieważ sugeruje, że klasa „ISA” wyspecjalizowana wersja innej klasy. Na przykład , Pracownik osoba ISA. Oznacza to, że klasa Employee jest dziedziczona z klasy Person.
W przeciwieństwie do „ISA”, relacja „HASA” przedstawia, że jednostka może mieć inną jednostkę jako swojego członka lub klasa ma wbudowany inny obiekt.
Tak więc, biorąc ten sam przykład klasy Pracownik, sposób, w jaki kojarzymy klasę Salary z pracownikiem, nie polega na jej dziedziczeniu, ale poprzez dołączanie lub umieszczanie obiektu Salary w klasie Employee. Związek „HASA” najlepiej przejawia się poprzez powstrzymywanie lub agregację.
Pytanie 60) Czy klasa pochodna dziedziczy czy nie dziedziczy?
Odpowiedź: Gdy klasa pochodna jest konstruowana z określonej klasy bazowej, w zasadzie dziedziczy ona wszystkie funkcje i zwykłe elementy członkowskie klasy bazowej. Ale są wyjątki od tej reguły. Na przykład klasa pochodna nie dziedziczy konstruktorów ani destruktorów klasy bazowej.
Każda klasa ma własne konstruktory i destruktory. Klasa pochodna również nie dziedziczy operatora przypisania klasy bazowej i przyjaciół klasy. Powodem jest to, że te encje są specyficzne dla określonej klasy i jeśli inna klasa jest pochodną lub jeśli jest przyjacielem tej klasy, nie można ich do nich przekazać.
Wielopostaciowość
P # 61) Co to jest polimorfizm?
Odpowiedź: Podstawowa idea polimorfizmu ma wiele form. W C ++ mamy dwa typy polimorfizmu:
(i) Polimorfizm w czasie kompilacji
W polimorfizmie czasu kompilacji uzyskujemy wiele form przez przeciążenie. Stąd mamy przeciążenie operatora i przeciążenie funkcji. (Omówiliśmy to już powyżej)
(ii) Polimorfizm w czasie wykonywania
To jest polimorfizm klas i obiektów. Ogólna idea jest taka, że klasa bazowa może być dziedziczona przez kilka klas. Wskaźnik klasy bazowej może wskazywać na swoją klasę podrzędną, a tablica klas bazowych może przechowywać różne obiekty klas podrzędnych.
Oznacza to, że obiekt reaguje inaczej na to samo wywołanie funkcji. Ten typ polimorfizmu może wykorzystywać mechanizm funkcji wirtualnych.
P # 62) Co to są funkcje wirtualne?
Odpowiedź: Funkcja wirtualna umożliwia klasom pochodnym zastąpienie implementacji dostarczonej przez klasę bazową.
Ilekroć mamy funkcje o tej samej nazwie w klasie bazowej i pochodnej, pojawia się niejednoznaczność, gdy próbujemy uzyskać dostęp do obiektu klasy potomnej za pomocą wskaźnika klasy bazowej. Ponieważ używamy wskaźnika klasy bazowej, wywoływana funkcja jest funkcją klasy bazowej o tej samej nazwie.
Aby skorygować tę niejednoznaczność, używamy słowa kluczowego „virtual” przed prototypem funkcji w klasie bazowej. Innymi słowy, sprawiamy, że ta polimorficzna funkcja staje się wirtualna. Używając funkcji wirtualnej, możemy usunąć niejednoznaczność i możemy uzyskać poprawny dostęp do wszystkich funkcji klasy potomnej za pomocą wskaźnika klasy bazowej.
Q # 63) Podaj przykład polimorfizmu w czasie wykonywania / funkcji wirtualnych.
Odpowiedź:
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; coutW powyższym kodzie klasa SHAPE ma czystą funkcję wirtualną i jest klasą abstrakcyjną (nie można jej utworzyć). Każda klasa jest pochodną funkcji SHAPE implementującej funkcję Draw () na swój własny sposób.
Co więcej, każda funkcja Draw jest wirtualna, więc gdy używamy wskaźnika klasy bazowej (SHAPE) za każdym razem z obiektem klas pochodnych (Circle i SQUARE), wówczas wywoływane są odpowiednie funkcje Draw.
Q # 64) Co masz na myśli mówiąc o czystych funkcjach wirtualnych?
Odpowiedź: Czysta wirtualna funkcja składowa to funkcja składowa, w której klasa bazowa wymusza zastąpienie klas pochodnych. Zwykle ta funkcja członkowska nie ma implementacji. Czyste funkcje wirtualne są równe zeru.
Przykład:
class Shape { public: virtual void draw() = 0; };
Klasę bazową, której składową jest czysta funkcja wirtualna, można określić jako „klasę abstrakcyjną”. Nie można utworzyć wystąpienia tej klasy i zwykle działa ona jako plan zawierający kilka podklas z dalszą implementacją.
P # 65) Co to są wirtualne konstruktory / niszczyciele?
Odpowiedź:
Wirtualne niszczyciele: Kiedy używamy wskaźnika klasy bazowej wskazującego na obiekt klasy pochodnej i używamy go do jego zniszczenia, to zamiast wywoływać destruktor klasy pochodnej, wywoływany jest destruktor klasy bazowej.
Przykład:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Jak pokazano w powyższym przykładzie, kiedy mówimy delete a, wywoływany jest destruktor, ale w rzeczywistości jest to destruktor klasy bazowej. To powoduje niejednoznaczność, że cała pamięć przechowywana przez b nie zostanie poprawnie wyczyszczona.
Ten problem można rozwiązać, stosując koncepcję „wirtualnego niszczyciela”.
To, co robimy, polega na tym, że konstruktor klasy bazowej jest „wirtualny”, aby wszystkie destruktory klas potomnych również stały się wirtualne, a kiedy usuwamy obiekt klasy bazowej wskazujący na obiekt klasy pochodnej, wywoływany jest odpowiedni destruktor obiekty zostały poprawnie usunięte.
Jest to pokazane w następujący sposób:
jak otworzyć plik torrentowany na komputerze Mac
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Wirtualny konstruktor : Konstruktorzy nie mogą być wirtualni. Zadeklarowanie konstruktora jako funkcji wirtualnej jest błędem składniowym.
Przyjaciel
Q # 66) Co to jest funkcja znajomego?
Odpowiedź: Klasa C ++ nie zezwala na dostęp do swoich prywatnych i chronionych elementów członkowskich poza klasą. Ale tę zasadę można złamać, wykorzystując „ Przyjaciel ”.
Jak sama nazwa wskazuje, funkcja zaprzyjaźniona jest funkcją zewnętrzną, która jest przyjacielem klasy. Aby funkcja znajomego miała dostęp do prywatnych i chronionych metod klasy, powinniśmy mieć prototyp funkcji znajomego ze słowem kluczowym „friend” zawartym w klasie.
Q # 67) Co to jest klasa znajomego?
Odpowiedź: Klasy zaprzyjaźnione są używane, gdy musimy przesłonić regułę dla specyfikatorów dostępu prywatnego i chronionego, aby dwie klasy mogły ściśle ze sobą współpracować.
Dlatego możemy mieć klasę przyjaciół, aby być przyjaciółmi innej klasy. W ten sposób zajęcia ze znajomymi mogą zachować prywatne, niedostępne rzeczy w takim stanie, w jakim są.
Kiedy mamy wymóg dostępu do wewnętrznej implementacji klasy (prywatnego członka) bez ujawniania szczegółów poprzez upublicznienie, przechodzimy do funkcji zaprzyjaźnionych.
Zaawansowany C ++
Szablony
P # 68) Co to jest szablon?
Odpowiedź: Szablony umożliwiają tworzenie funkcji, które są niezależne od typu danych (ogólne) i mogą przyjmować dowolny typ danych jako parametry i zwracać wartość bez konieczności przeciążania funkcji wszystkimi możliwymi typami danych. Szablony prawie spełniają funkcje makra.
Jego prototyp to jeden z poniższych:
szablon zidentyfikować > deklaracja_funkcji;
szablon zidentyfikować > deklaracja_funkcji;
Jedyną różnicą między obydwoma prototypami jest użycie słowa kluczowego class lub typename. Ich podstawowa funkcja bycia generycznym pozostaje taka sama.
Obsługa wyjątków
P # 69) Co to jest obsługa wyjątków? Czy C ++ obsługuje obsługę wyjątków?
Odpowiedź: Tak C ++ obsługuje obsługę wyjątków.
Nie możemy zagwarantować, że kod będzie zawsze wykonywał się normalnie. Mogą zaistnieć pewne sytuacje, które mogą zmusić napisany przez nas kod do nieprawidłowego działania, mimo że jest wolny od błędów. To nieprawidłowe działanie kodu nazywa się Wyjątek .
Gdy wystąpił wyjątek, kompilator musi go zgłosić, abyśmy wiedzieli, że wystąpił wyjątek. Gdy wyjątek został zgłoszony, kompilator musi upewnić się, że jest on obsługiwany prawidłowo, aby przepływ programu był kontynuowany lub kończył się poprawnie. Nazywa się to obsługa wyjątku.
Tak więc w C ++ mamy trzy słowa kluczowe tj. próbować , rzucać i złapać które są w obsłudze wyjątków.
Ogólna składnia bloku wyjątków jest następująca:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Jak pokazano powyżej, kod, który może potencjalnie działać nieprawidłowo, jest umieszczony pod blokiem try. Gdy kod działa nieprawidłowo, zgłaszany jest wyjątek. Ten wyjątek jest następnie przechwytywany pod blokiem catch i jest obsługiwany, tj. Podejmowane jest odpowiednie działanie.
Q # 70) Chcesz komentować standardowe wyjątki języka C ++?
Odpowiedź: C ++ obsługuje niektóre standardowe wyjątki, które można złapać, jeśli umieścimy kod wewnątrz bloku try. Te wyjątki są częścią klasy bazowej „ std :: wyjątek ”. Ta klasa jest zdefiniowana w pliku nagłówkowym C ++.
Kilka przykładów wyjątków obsługiwanych przez tę klasę obejmuje:
bad_alloc - wyrzucony przez „nowy”
runtime_error - zgłaszany w przypadku błędów wykonania
bad_typeid - wyrzucony przez identyfikator typu
Wprowadzenie do biblioteki szablonów standardowych
Q # 71) Co to jest standardowa biblioteka szablonów (STL)? Jakie są różne typy kontenerów STL?
Odpowiedź: Biblioteka standardowych szablonów (STL) to biblioteka szablonów kontenerów zatwierdzonych przez komitet ANSI do włączenia do standardowej specyfikacji C ++. Posiadamy różne typy kontenerów STL w zależności od sposobu przechowywania elementów.
- Kolejka, stos - Są takie same jak tradycyjne kolejki i stosy i nazywane są kontenerami adaptacyjnymi.
- Zestaw, mapa - Są to w zasadzie kontenery, które mają pary klucz / wartość i mają charakter asocjacyjny.
- Wektor i - Są z natury sekwencyjne i mają podobieństwa do tablic.
P # 72) Co to jest klasa Iterator?
Odpowiedź: W C ++ klasa kontenera to zbiór różnych obiektów.
Jeśli musimy przejść przez tę kolekcję obiektów, nie możemy tego zrobić za pomocą prostych zmiennych indeksujących. Dlatego mamy specjalną klasę w STL o nazwie Iterator klasa, której można użyć do przechodzenia przez zawartość klasy kontenera.
Różne kategorie iteratorów obejmują Iteratory wejściowe, Iteratory wyjściowe, Iteratory do przodu, Iteratory dwukierunkowe, dostęp losowy itp.
P # 73) Jaka jest różnica między zewnętrznym Iteratorem a wewnętrznym Iteratorem? Opisz zalety zewnętrznego Iteratora.
Odpowiedź: Iterator wewnętrzny jest zaimplementowany z funkcjami składowymi klasy, która ma elementy do przejścia.
Iterator zewnętrzny jest implementowany jako oddzielna klasa, którą można powiązać z obiektem zawierającym elementy do przejścia. Podstawową zaletą zewnętrznego iteratora jest to, że jest łatwy do zaimplementowania, ponieważ jest implementowany jako oddzielna klasa.
Po drugie, ponieważ jest to inna klasa, wiele obiektów iteratorów może być aktywnych jednocześnie.
Dalsza lektura => Pytania do wywiadu w języku C #
Wniosek
Prawie wszystkie główne tematy związane z kodowaniem i programowaniem w rozmowie z C ++ są omówione w tym artykule.
Mamy nadzieję, że każdy kandydat poczuje się zrelaksowany po przygotowaniu się do rozmowy kwalifikacyjnej przy użyciu tej serii pytań.
Wszystkiego najlepszego za rozmowę kwalifikacyjną !!
rekomendowane lektury
- Pytania i odpowiedzi do wywiadu
- ETL Testing Interview Pytania i odpowiedzi
- Niektóre trudne pytania i odpowiedzi do testowania ręcznego
- 25 najlepszych pytań i odpowiedzi do wywiadów z testami zwinnymi
- Pytania do wywiadu Spocka z odpowiedziami (najpopularniejsze)
- Kilka interesujących pytań do rozmowy kwalifikacyjnej dotyczącej testowania oprogramowania
- 20+ najczęściej zadawanych pytań i odpowiedzi do wywiadów .NET
- 32 najlepsze pytania i odpowiedzi do wywiadów z danymi