top 70 c interview questions
Най-често задавани основни и усъвършенствани въпроси за интервю за C ++ с примери за кодове за кандидати от начално ниво, както и опитни професионалисти:
Тази подробна статия със сигурност ще бъде показалец за тези, които се подготвят за интервю за C ++.
Почти всички основни теми в C ++ са разгледани тук, заедно с някои основни въпроси по разширени теми като стандартна библиотека на шаблони (STL) и др.
Този набор от C ++ въпроси за кодиране ще ви помогне да се изправите уверено пред всяко C ++ интервю и да го изчистите успешно при първия опит.
Какво ще научите:
- Въпроси за интервю за C ++ с примери за кодове
Въпроси за интервю за C ++ с примери за кодове
По-долу са изброени най-популярните въпроси за интервю за програмиране на C ++, на които отговаря експерт по C ++.
Прочетете също => Водещи въпроси за интервю за програмиране C
Основен C ++
Структура на програма C ++
В # 1) Каква е основната структура на програма C ++?
Отговор: Основната структура на програма C ++ е показана по-долу:
#include int main() { cout<<”Hello,World!”; return 0; }
Първият ред, който започва с „ # ' е директива за препроцесор . В този случай използваме включва като директива, която казва на компилатора да включва заглавка, докато „ iostream.h ”, Който ще се използва за основен вход / изход по-късно в програмата.
Следващият ред е функцията “main”, която връща цяло число. Основната функция е началната точка на изпълнение за всяка програма на C ++. Независимо от позицията му във файла с изходния код, съдържанието на основната функция винаги се изпълнява първо от компилатора C ++.
В следващия ред можем да видим отворени къдрави скоби, които показват началото на блок от код. След това виждаме инструкцията за програмиране или реда с код, който използва броя, който е стандартният изходен поток (дефиницията му присъства в iostream.h).
Този изходен поток взема низ от символи и го отпечатва на стандартно изходно устройство. В този случай това е „Здравей, Свят!“. Моля, обърнете внимание, че всяка инструкция на C ++ завършва с точка и запетая (;), което е много необходимо и пропускането му ще доведе до грешки при компилацията.
Преди да затворим скобите}, виждаме друга линия „return 0;“. Това е връщащата точка към основната функция.
Всяка програма C ++ ще има основна структура, както е показано по-горе с директива за препроцесор, декларация на основната функция, последвана от блок код и след това точка за връщане към основната функция, която показва успешно изпълнение на програмата.
В # 2) Какви са коментарите в C ++?
Отговор: Коментарите в C ++ са просто част от изходния код, игнорирана от компилатора. Те са полезни само за програмист да добави описание или допълнителна информация за своя изходен код.
В C ++ има два начина за добавяне на коментари:
- // едноредов коментар
- / * блокиране на коментар * /
Първият тип ще отхвърли всичко, след като компилаторът срещне “//”. Във втория тип компилаторът изхвърля всичко между „/ *” и „* /”.
Променливи, типове данни и константи
В # 3) Разлика между декларацията и дефиницията на променлива.
Отговор: Декларацията на променлива е просто определяне на типа данни на променлива и името на променливата. В резултат на декларацията казваме на компилатора да запази място за променлива в паметта според посочения тип данни.
Пример:
int Result; char c; int a,b,c;
Всички по-горе са валидни декларации. Също така имайте предвид, че в резултат на декларацията стойността на променливата не е определена.
Докато дефиницията е изпълнение / екземпляр на декларираната променлива, където свързваме подходяща стойност с декларираната променлива, така че линкерът да може да свързва препратки към съответните обекти.
От горе Пример ,
Резултат = 10;
C = ‘A’;
Това са валидни определения.
В # 4) Коментирайте местния и глобалния обхват на променлива.
Отговор: Обхватът на променлива се определя като степента на програмния код, в който променливата остава активна, т.е.може да бъде декларирана, дефинирана или работена с нея.
Има два вида обхват в C ++:
- Местен обхват: Казва се, че променливата има локален обхват или е локална, когато е декларирана вътре в кодов блок. Променливата остава активна само вътре в блока и не е достъпна извън кодовия блок.
- Глобален обхват: Променливата има глобален обхват, когато е достъпна в цялата програма. Глобална променлива се декларира върху програмата преди всички дефиниции на функции.
Пример:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
В # 5) Какъв е приоритетът, когато в програмата има глобална променлива и локална променлива със същото име?
Отговор: Когато има локална променлива със същото име като тази на глобална променлива, компилаторът дава предимство на локалната променлива.
Пример:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Резултатът от горния код е 5. Това е така, защото, въпреки че и двете променливи имат едно и също име, компилаторът е дал предпочитание на локалния обхват.
В # 6) Когато има глобална променлива и местна променлива с едно и също име, как ще получите достъп до глобалната променлива?
Отговор: Когато има две променливи с едно и също име, но различен обхват, т.е.едната е локална променлива, а другата е глобална променлива, компилаторът ще даде предпочитание на локална променлива.
За да получим достъп до глобалната променлива, ние използваме „ оператор за разделителна способност (: :) ”. Използвайки този оператор, можем да получим достъп до стойността на глобалната променлива.
Пример:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Изход:
Глобална променлива x = 10
локална променлива x = 2
В # 7) Колко са начините за инициализиране на int с константа?
Отговор: Има два начина:
- Първият формат използва традиционна нотация C.
int резултат = 10; - Вторият формат използва нотацията на конструктора.
int резултат (10);
Константи
В # 8) Какво е константа? Обяснете с пример.
Отговор: Константа е израз, който има фиксирана стойност. Те могат да бъдат разделени на целочислени, десетични, константи с плаваща запетая, символ или низ в зависимост от техния тип данни.
Освен десетичната, C ++ поддържа още две константи, т.е. осмични (към основата 8) и шестнадесетични (до основата 16) константи.
Примери за константи:
- 75 // цяло число (десетично)
- 0113 // осмоц
- 0x4b // шестнадесетичен
- 3.142 // с плаваща запетая
- ‘C’ // символна константа
- “Здравей, Свят” // низ константа
Забележка: Когато трябва да представим един знак, използваме единични кавички и когато искаме да дефинираме константа с повече от един знак, използваме двойни кавички.
В # 9) Как дефинирате / декларирате константи в C ++?
Отговор: В C ++ можем да дефинираме нашите собствени константи, използвайки #define директива за препроцесор.
#define Идентификатор стойност
Пример:
#include #define PI 3.142 int main () { float radius =5, area; area = PI * r * r; cout<<”Area of a Circle = “< Изход: Площ на кръг = 78,55
Както е показано в горния пример, след като дефинираме константа, използвайки директивата #define, можем да я използваме в цялата програма и да заместим нейната стойност.
Можем да декларираме константи в C ++, като използваме „ конст ”Ключова дума. Този начин е подобен на този при деклариране на променлива, но с префикс const.
Примери за деклариране на константа
const int pi = 3.142;
const char c = “sth”;
const пощенски код = 411014;
В горните примери, винаги когато типът на константа не е посочен, компилаторът на C ++ го задава по подразбиране на цяло число.
Оператори
Въпрос # 10) Коментар на оператора за присвояване в C ++.
Отговор: Операторът за присвояване в C ++ се използва за присвояване на стойност на друга променлива.
а = 5;
Този ред код присвоява целочислената стойност 5 към променлива да се .
Частта вляво от оператора = е известна като стойност (лява стойност) и дясната като rvalue (дясна стойност). L стойност винаги трябва да е променлива, докато дясната страна може да бъде константа, променлива, резултат от операция или комбинация от тях.
Операцията за присвояване винаги се извършва отдясно наляво и никога в обратната посока.
Едно свойство, което C ++ притежава над останалите езици за програмиране, е, че операторът на присвояване може да се използва като rvalue (или част от rvalue ) за друго задание.
Пример:
a = 2 + (b = 5);
е еквивалентно на:
b = 5;
a = 2 + b;
Което означава, първо назначете 5 към променлива б и след това задайте на да се, стойността две плюс резултата от предишния израз на б (това е 5), оставя да се с крайна стойност 7 .
Следователно, следният израз е валиден и в C ++:
a = b = c = 5;
присвояване на 5 на променливи да се , б и ° С .
В # 11) Каква е разликата между равен на (==) и оператор за присвояване (=)?
Отговор: В C ++, равни на (==) и оператор за присвояване (=) са два напълно различни оператора.
Равен на (==) е релационен оператор за равенство, който оценява два израза, за да види дали са равни и връща true, ако са равни, и false, ако не са.
Операторът за присвояване (=) се използва за присвояване на стойност на променлива. Следователно, можем да имаме сложна операция за присвояване в релационния оператор за равенство за оценка.
В # 12) Кои са различните аритметични оператори в C ++?
Отговор: C ++ поддържа следните аритметични оператори:
- + допълнение
- - изваждане
- * умножение
- / разделение
- % модул
Нека да демонстрираме различните аритметични оператори със следния код.
Пример:
#include int main () { int a=5, b=3; cout<<”a + b = “< Изход :
a + b = 8
a - b = 2
a * b = 15
a / b = 2
a% b = 1
Както е показано по-горе, всички останали операции са ясни и същите като действителните аритметични операции, с изключение на модулния оператор, който е доста различен. Операторът по модул разделя a и b и резултатът от операцията е остатъкът от разделението.
В # 13) Кои са различните оператори за присвояване на сложни в C ++?
Отговор: Следват операторите за присвояване на Compound в C ++:
+ =, - =, * =, / =,% =, >> =,<<=, &=, ^=,|=
Сложният оператор за присвояване е една от най-важните характеристики на езика C ++, която ни позволява да променяме стойността на променлива с един от основните оператори:
Пример:
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;
Въпрос # 14) Посочете разликата между операциите за увеличаване / намаляване след и след.
Отговор: C ++ позволява два оператора, т.е. ++ (нарастване) и - (намаляване), които ви позволяват да добавите 1 към съществуващата стойност на променлива и да извадите 1 от променливата съответно. Тези оператори от своя страна се наричат инкремент (++) и декремент (-).
Пример:
а = 5;
a ++;
Вторият израз, ++, ще доведе до добавяне на 1 към стойността на a. По този начин ++ е еквивалентно на
a = a + 1; или
a + = 1;
Уникална характеристика на тези оператори е, че можем да добавяме или добавяме тези оператори към променливата. Следователно, ако a е променлива и ние добавяме префикса на оператора за инкремент, той ще бъде
++ а;
Това се нарича Предварително увеличаване. По същия начин имаме и предварително намаляване.
Ако поставим префикса на променливата a с оператор на инкремент, ще имаме,
a ++;
Това е пост-увеличението. По същия начин имаме и след намаляване.
Разликата между значението на pre и post зависи от начина на оценяване на израза и съхраняването на резултата.
В случай на оператора за предварително увеличаване / намаляване, операцията за увеличаване / намаляване се извършва първо и след това резултатът се предава на lvalue. Докато при операциите след увеличаване / намаляване намалява първо стойността на lvalue и след това съответно се извършва увеличение / намаляване.
Пример:
а = 5; b = 6;
++ а; # a = 6
b–; # b = 6
–А; # a = 5
b ++; # 6
I / O чрез конзола
В # 15) Какви са операторите за извличане и вмъкване в C ++? Обяснете с примери.
Отговор: В библиотеката iostream.h на C ++, Китай , и цена са двата потока данни, които се използват съответно за въвеждане и извеждане. Cout обикновено е насочен към екрана, а cin е присвоен на клавиатурата.
“Cin” (оператор за извличане): Използвайки претоварен оператор >> с поток cin, C ++ обработва стандартния вход.
int age; cin>>age;
Както е показано в горния пример, се декларира целочислена променлива ‘age’ и след това изчаква cin (клавиатура) да въведе данните. “Cin” обработва входа само при натискане на бутона RETURN.
“Cout” (оператор за вмъкване): Това се използва заедно с претовареното<< operator. It directs the data that followed it into the cout stream.
Пример:
създайте нов java проект в eclipse -
cout<<”Hello, World!”; cout<<123;
Контролни структури и функции
Контролни структури и контури
В # 16) Каква е разликата между цикъл while и do while? Обяснете с примери.
Отговор: Форматът на цикъл while в C ++ е:
Докато (израз)
{изявления;}
Операторният блок под while се изпълнява, докато условието в дадения израз е вярно.
Пример:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<В горния код цикълът ще излезе директно, ако n е 0. По този начин в цикъл while, крайното условие е в началото на цикъла и ако е изпълнено, не се изпълняват итерации на цикъла.
След това разглеждаме цикъла за изпълнение.
Общият формат на време на изпълнение е:
do {изявление;} докато (условие);
Пример:
#include int main() { int n; cout<>n; do { cout<В горния код можем да видим, че изразът вътре в цикъла се изпълнява поне веднъж, тъй като условието на цикъла е в края. Това са основните разлики между time и do-while.
В случай на цикъл while, можем директно да излезем от цикъла в началото, ако условието не е изпълнено, докато в цикъла do-while изпълняваме операторите на цикъла поне веднъж.
Функции
Въпрос # 17) Какво имате предвид под типа на връщане „void“?
разлика между c c ++ и java
Отговор: Всички функции трябва да връщат стойност според общия синтаксис.
В случай, че ако не искаме функция да връща някаква стойност, използваме „ нищожен ”, За да посочи това. Това означава, че използваме „ нищожен ”, За да покаже, че функцията няма стойност за връщане или връща“ нищожен ”.
Пример:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Въпрос # 18) Обяснете 'Преминаване по стойност' и 'Предаване по препоръка'
Отговор: Докато предаваме параметри на функцията, използвайки „Предаване от стойност“, ние предаваме копие на параметрите на функцията.
Следователно, каквито и да са модификации на параметрите в извиканата функция, не се предават обратно на извикващата функция. По този начин променливите в извикващата функция остават непроменени.
Пример:
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 = “< Изход:
x = 1
y = 3
z = 4
Както се вижда по-горе, въпреки че параметрите бяха променени в извиканата функция, техните стойности не бяха отразени във извикващата функция, тъй като бяха предадени по стойност.
Ако обаче искаме да върнем променените стойности от функцията обратно към извикващата функция, тогава използваме техниката „Преминаване от референция”.
За да демонстрираме това, ние модифицираме горната програма, както следва:
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 = “< Изход:
x = 2
у = 6
z = 8
Както е показано по-горе, модификациите, направени на параметрите в извиканите функции, се предават на извикващата функция, когато използваме техниката „Предаване от препратка”. Това е така, защото с помощта на тази техника не предаваме копие на параметрите, но всъщност предаваме самата референция на променливата.
В # 19) Какво представляват параметрите по подразбиране? Как се оценяват във функцията C ++?
Отговор: Параметър по подразбиране е стойност, която се присвоява на всеки параметър, докато се декларира функция.
Тази стойност се използва, ако този параметър е оставен празен при извикване на функцията. За да зададем стойност по подразбиране за определен параметър, ние просто присвояваме стойност на параметъра в декларацията на функцията.
Ако стойността не е предадена за този параметър по време на извикване на функция, тогава компилаторът използва предоставената стойност по подразбиране. Ако е посочена стойност, тогава тази стойност по подразбиране се стъпва и се използва предадената стойност.
Пример:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Изход:
12
6
Както е показано в горния код, има две повиквания за функция за умножение. При първото извикване се предава само един параметър със стойност. В този случай вторият параметър е предоставената стойност по подразбиране. Но при второто извикване, тъй като и двете стойности на параметрите се предават, стойността по подразбиране се заменя и се използва предадената стойност.
В # 20) Какво представлява вградената функция в C ++?
Отговор: Вградената функция е функция, която се компилира от компилатора като точка на извикване на функцията и кодът се замества в тази точка. Това прави компилирането по-бързо. Тази функция се дефинира чрез добавяне на префикса на прототипа на функцията с ключовата дума „вграден“.
Такива функции са изгодни само когато кодът на вградената функция е малък и опростен. Въпреки че дадена функция е дефинирана като Inline, тя е напълно зависима от компилатора, за да я оцени като вградена или не.
Структура за разширени данни
Масиви
В # 21) Защо масивите обикновено се обработват с for цикъл?
Отговор: Array използва индекса, за да пресече всеки от неговите елементи.
Ако A е масив, тогава всеки от неговите елементи е достъпен като A [i]. Програмно всичко, което е необходимо, за да работи това, е итеративен блок с циклична променлива i, който служи като индекс (брояч), нарастващ от 0 до A.length-1.
Точно това прави един цикъл и това е причината, поради която обработваме масиви, използващи for цикли.
Q # 22) Посочете разликата между изтриване и изтриване [].
Отговор: “Delete []” се използва за освобождаване на паметта, разпределена към масив, който е бил разпределен с помощта на new []. “Delete” се използва за освобождаване на една част от паметта, която е била разпределена с помощта на нова.
В # 23) Какво не е наред с този код?
T * p = ново T [10];
изтрийте p;
Отговор: Горният код е синтактично правилен и ще се компилира добре.
Единственият проблем е, че той просто ще изтрие първия елемент от масива. Въпреки че целият масив е изтрит, ще бъде извикан само деструкторът на първия елемент и паметта за първия елемент ще бъде освободена.
В # 24) Какъв е редът, в който обектите в масива се унищожават?
Отговор: Обектите в масив се унищожават в обратния ред на конструиране: Първо построено, последно разрушено.
В следващия пример, редът за деструктори ще бъде [9], a [8],…, a [1], a [0]:
voiduserCode() { Car a[10]; ... }
Указатели
В # 25) Какво не е наред с този код?
Т * р = 0;
изтрийте p;
Отговор: В горния код показалецът е нулев указател. Съгласно стандарта C ++ 03 е напълно валидно да се извика изтриване на NULL указател. Операторът за изтриване ще се погрижи за проверката NULL вътрешно.
В # 26) Какво представлява референтната променлива в C ++?
Отговор: Референтната променлива е псевдоним на съществуващата променлива. Това означава, че както името на променливата, така и референтната променлива сочат към едно и също място в паметта. Следователно, когато променливата се актуализира, препратката също се актуализира.
Пример:
int a=10; int& b = a;
Тук b е препратката към a.
Класове за съхранение
В # 27) Какво представлява класът за съхранение? Споменете класовете за съхранение в C ++.
Отговор: Класът за съхранение определя живота или обхвата на символи като променлива или функции.
C ++ поддържа следните класове за съхранение:
- Автоматичен
- Статично
- Външен
- Регистрирам
- Променлив
Въпрос # 28) Обяснете спецификатора на клас на променливо съхранение.
Отговор: Променливата на член на обект на постоянен клас не може да бъде променена. Като декларираме променливите като „променливи“, можем да променим стойностите на тези променливи.
В # 29) За какво е ключовата дума auto?
Отговор: По подразбиране всяка локална променлива на функцията е автоматична, т.е. Автоматичен . В функцията по-долу и двете променливи „i“ и „j“ са автоматични променливи.
void f() { int i; auto int j; }
ЗАБЕЛЕЖКА : Глобалната променлива не е автоматична променлива.
В # 30) Какво е статична променлива?
Отговор: Статичната променлива е локална променлива, която запазва стойността си при извикванията на функцията. Статичните променливи се декларират с помощта на ключовата дума „static“. Числовите променливи, които са статични, имат стойността по подразбиране като нула.
Следващата функция ще отпечата 1 2 3, ако се извика три пъти.
void f() { static int i; ++i; printf(“%d “,i); }
Ако глобалната променлива е статична, тогава нейната видимост е ограничена до същия изходен код.
В # 31) Каква е целта на Extern Storage Specifier?
Отговор: Спецификаторът “Extern” се използва за разрешаване на обхвата на глобален символ.
#include using nam espace std; main() { extern int i; cout< В горния код „i“ може да се вижда извън файла, където е дефиниран.
В # 32) Обяснете спецификатора за съхранение на регистъра.
Отговор: Променливата „Регистрация“ трябва да се използва винаги, когато се използва променливата. Когато променлива е декларирана с спецификатор “register”, тогава компилаторът дава регистър на CPU за нейното съхранение, за да ускори търсенето на променливата.
Въпрос # 33) Кога да използваме аргументи за препратка “const” във функция?
Отговор: Използването на референтни аргументи „const“ във функция е полезно по няколко начина:
- “Const” предпазва от програмни грешки, които могат да променят данните.
- В резултат на използването на “const”, функцията е в състояние да обработва както const, така и non-const действителни аргументи, което не е възможно, когато не се използва “const”.
- Използването на препратка const ще позволи на функцията да генерира и използва временна променлива по подходящ начин.
Структура и дефинирани от потребителя типове данни
В # 34) Какво е клас?
Отговор: Класът е дефиниран от потребителя тип данни в C ++. Той може да бъде създаден за решаване на определен вид проблем. След създаването от потребителя не се изисква да знае подробностите за работата на даден клас.
Като цяло класът действа като план на проект и може да включва в различни параметри и функции или действия, работещи с тези параметри. Те се наричат членове на класа.
В # 35) Разлика между клас и структура.
Отговор:
Структура: На език C структурата се използва за групиране на различни типове типове данни заедно. Променливите вътре в структурата се наричат членове на структурата. Тези членове са по подразбиране публични и могат да бъдат достъпни, като се използва името на структурата, последвано от точков оператор и след това името на члена.
Клас: Класът е наследник на Структурата. C ++ разширява дефиницията на структурата, за да включва функциите, които работят върху нейните членове. По подразбиране всички членове в класа са частни.
Обектно-ориентирано програмиране с C ++
Класове, конструктори, деструктори
В # 36) Какво е пространство от имена?
Отговор: Пространството от имена ни позволява да групираме набор от глобални класове, обекти и / или функции под конкретно име.
Общата форма за използване на пространства от имена е:
идентификатор на пространство от имена {namespace-body}
Когато идентификаторът е всеки валиден идентификатор, а тялото-пространство на имената е набор от класове, обекти и функции, които са включени в пространството на имената. Пространствата от имена са особено полезни в случаите, когато има възможност повече от един обект да имат едно и също име, което води до сблъсъци между имена.
Въпрос # 37) Каква е ползата от декларацията за „използване“?
Отговор: Използването на Декларация се използва за препращане на име от пространството на имената без оператора за разделителна способност на обхвата.
Q # 38) Какво е Mangling Name?
Отговор: C ++ компилаторът кодира параметрите с функция / метод в уникално име. Този процес се нарича манипулиране на имена. Обратният процес се нарича демонтаж.
Пример:
A :: b (int, long) const е изкривен като ‘B__C3Ail’ .
За конструктор името на метода е пропуснато.
Това е A :: A (int, long) const е изкривен като „C3Ail“.
В # 39) Каква е разликата между обект и клас?
Отговор: Класът е план на проект или проблем, който трябва да бъде решен и се състои от променливи и методи. Те се наричат членове на класа. Не можем да осъществим достъп до методи или променливи на класа самостоятелно, освен ако не са декларирани като статични.
За да имаме достъп до членовете на класа и да ги използваме, трябва да създадем екземпляр на клас, който се нарича Object. Класът има неограничен живот, докато обектът има само ограничен живот.
В # 40) Кои са различните спецификатори за достъп в C ++?
Отговор: C ++ поддържа следните спецификатори за достъп:
- Публично: Членовете на данни и функциите са достъпни извън класа.
- Частно: Членовете на данни и функциите не са достъпни извън класа. Изключение е използването на приятелски клас.
- Защитени: Членовете на данни и функциите са достъпни само за производни класове.
Пример:
Опишете ЧАСТНИ, ЗАЩИТЕНИ и ОБЩЕСТВЕНИ, заедно с техните различия и дайте примери.
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
В # 41) Какво е конструктор и как се нарича?
Отговор: Конструкторът е член-функция на класа със същото име като класа. Използва се главно за инициализиране на членовете на класа. По подразбиране конструкторите са публични.
Има два начина, по които се наричат конструкторите:
- Неявно: Конструкторите имплицитно се извикват от компилатора, когато се създава обект от класа. Това създава обект в стека.
- Изрично обаждане: Когато обектът на клас се създава с помощта на new, конструкторите се извикват изрично. Това обикновено създава обект в купчина.
Пример:
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. }
В # 42) Какво е КОПИЯ КОНСТРУКТОР и кога се нарича?
Отговор: Конструктор за копиране е конструктор, който приема обект от същия клас като свой параметър и копира членовете си от данни в обекта в лявата част на заданието. Полезно е, когато трябва да конструираме нов обект от същия клас.
Пример:
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 }
В # 43) Какво е конструктор по подразбиране?
Отговор: Конструктор по подразбиране е конструктор, който или няма аргументи, или ако има такива, тогава всички те са аргументи по подразбиране.
Пример:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv[]) { B b; return 0; }
В # 44) Какво е конструктор на преобразуване?
Отговор: Това е конструктор, който приема един аргумент от различен тип. Конверторите за преобразуване се използват главно за преобразуване от един тип в друг.
В # 45) Какво е явен конструктор?
Отговор: Конструктор на преобразуване се декларира с изричната ключова дума. Компилаторът не използва изричен конструктор за реализиране на подразбиращо се преобразуване на типове. Целта му е запазена изрично за строителство.
В # 46) Каква е ролята на ключовата дума Static за променлива на член на класа?
Отговор: Статичната променлива член споделя обща памет за всички обекти, създадени за съответния клас. Не е необходимо да се позоваваме на статичната променлива член, използвайки обект. Въпреки това, той може да бъде достъпен чрез самото име на класа.
Въпрос # 47) Обяснете функцията за статичен член.
Отговор: Функцията за статичен член може да има достъп само до променливата на статичния член на класа. Подобно на статичните променливи на членове, функцията на статичен член може да бъде достъпна и с името на класа.
В # 48) Какъв е редът, в който се унищожават локалните обекти?
Отговор: Помислете за следването на част от кода:
Class A{ …. }; int main() { A a; A b; ... }
В основната функция имаме два обекта, създадени един след друг. Те се създават по ред, първо а след това b. Но когато тези обекти бъдат изтрити или ако излязат извън обхвата, деструкторът за всеки ще бъде извикан в обратния ред, в който са конструирани.
Следователно, деструкторът на b ще бъде извикан първо, последван от a. Дори да имаме масив от обекти, те ще бъдат унищожени по същия начин в обратния ред на тяхното създаване.
Претоварване
Q # 49) Обяснете претоварването на функциите и претоварването на оператора.
Отговор: C ++ поддържа концепцията за ООП полиморфизъм, което означава „много форми“.
В C ++ имаме два вида полиморфизъм, т.е.полиморфизъм по време на компилация и полиморфизъм по време на изпълнение. Полиморфизмът по време на компилация се постига чрез използване на техника за претоварване. Претоварването просто означава придаване на допълнително значение на даден обект чрез запазване на основното му значение непокътнато.
C ++ поддържа два вида претоварване:
Претоварване на функцията:
Претоварването на функциите е техника, която позволява на програмиста да има повече от една функция със същото име, но различен списък с параметри. С други думи, ние претоварваме функцията с различни аргументи, т.е. независимо дали става въпрос за типа аргументи, броя на аргументите или реда на аргументите.
Претоварването на функцията никога не се постига при нейния тип връщане.
Претоварване на оператора:
Това е още един тип полиморфизъм по време на компилация, който се поддържа от C ++. При претоварване на оператора, операторът е претоварен, за да може да работи както на дефинираните от потребителя типове, така и с операндите от стандартния тип данни. Но докато правим това, стандартната дефиниция на този оператор се запазва непокътната.
Например, оператор на добавяне (+), който работи с числови типове данни, може да бъде претоварен, за да работи с два обекта, точно като обект от сложен числов клас.
Въпрос # 50) Каква е разликата между претоварването на метода и заместването на метода в C ++?
Отговор: Претоварването на метода има функции с едно и също име, но различни списъци с аргументи. Това е форма на полиморфизъм по време на компилация.
Заместването на метода се появява, когато пренапишем метода, който е получен от основен клас. Заменянето на метода се използва при работа с полиморфизъм по време на изпълнение или виртуални функции.
В # 51) Каква е разликата между конструктор за копиране и претоварен Оператор за възлагане?
Отговор: Конструктор за копиране и претоварен оператор за присвояване основно служат на една и съща цел, т.е.присвояване на съдържанието на един обект на друг. Но все пак има разлика между двете.
Пример:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
В горния пример вторият оператор c1 = c2 е претоварен оператор за присвояване.
Тук и c1, и c2 са вече съществуващи обекти и съдържанието на c2 се присвоява на обекта c1. Следователно, за претоварен оператор за присвояване и двата обекта трябва да бъдат създадени вече.
Следващото твърдение, комплекс c3 = c2 е пример за конструктора на копиране. Тук съдържанието на c2 се присвоява на нов обект c3, което означава, че конструкторът на копиране създава нов обект всеки път, когато изпълнява.
В # 52) Назовете операторите, които не могат да бъдат претоварени.
Отговор:
- sizeof - размер на оператор
- . - Точкови оператор
- . * - оператор за пренасочване
- -> - оператор за пренасочване на членове
- :: - оператор за резолюция на обхвата
- ?: - условен оператор
Q # 53) Функцията може да бъде претоварена въз основа на параметъра, който е стойност или препратка. Обяснете дали твърдението е вярно.
Отговор: Невярно. И двете, Преминаване по стойност и Преминаване по препратка изглеждат идентични с обаждащия се.
В # 54) Какви са ползите от претоварването на оператора?
Отговор: Чрез претоварване на стандартни оператори за клас можем да разширим значението на тези оператори, така че те да могат да работят и с другите дефинирани от потребителя обекти.
Претоварването на функциите ни позволява да намалим сложността на кода и да го направим по-ясен и четим, тъй като можем да имаме еднакви имена на функции с различни списъци с аргументи.
Наследяване
В # 55) Какво е наследяване?
Отговор: Наследяването е процес, чрез който можем да придобием характеристиките на съществуващ обект и да формираме нов обект, като добавим повече функции към него.
По отношение на C ++, наследяването създава нов клас, като го извлича от съществуващ клас, така че този нов клас да притежава свойствата на своя родителски клас, както и своите собствени.
В # 56) Какви са предимствата на наследяването?
Отговор: Наследяването позволява повторно използване на кода, като по този начин спестява време за разработване на код.
Чрез наследяването ние използваме висококачествен софтуер без грешки, който намалява бъдещите проблеми.
Въпрос # 57) Поддържа ли C ++ многостепенни и множествени наследства?
Отговор: Да.
В # 58) Какво представляват множествените наследства (виртуално наследяване)? Какви са неговите предимства и недостатъци?
Отговор: При множество наследства имаме повече от един основен клас, от който производен клас може да наследява. Следователно производен клас взема характеристиките и свойствата на повече от един основен клас.
Например , клас шофьор ще има два основни класа, а именно, служител и човек, защото шофьорът е служител, както и човек. Това е изгодно, тъй като класът на водача може да наследи свойствата на служителя, както и на класа на човека.
Но в случай на служител и човек, класът ще има някои общи свойства. Ще възникне обаче двусмислена ситуация, тъй като класът на драйвера няма да знае класовете, от които трябва да се наследят общите свойства. Това е основният недостатък на множество наследства.
Въпрос # 59) Обяснете връзките между класовете ISA и HASA. Как бихте внедрили всеки?
Отговор: Връзката “ISA” обикновено показва наследяване, тъй като предполага, че клас “ISA” специализирана версия на друг клас. Например , Служител ISA лице. Това означава, че клас на служител се наследява от класа Person.
Противно на “ISA”, връзката “HASA” показва, че даден обект може да има друг обект като свой член или клас има друг обект, вграден в него.
Така че като вземем същия пример за клас Employee, начинът, по който свързваме класа Salary със служителя, не е чрез наследяването му, а чрез включване или съдържане на обект Salary в класа Employee. Връзката „HASA“ се показва най-добре чрез ограничаване или агрегиране.
В # 60) Наследява ли производен клас или не наследява?
Отговор: Когато производен клас е конструиран от определен основен клас, той на практика наследява всички характеристики и обикновени членове на базовия клас. Но има някои изключения от това правило. Например производен клас не наследява конструкторите и деструкторите на базовия клас.
Всеки клас има свои собствени конструктори и деструктори. Полученият клас също не наследява оператора за присвояване на базовия клас и приятели на класа. Причината е, че тези обекти са специфични за определен клас и ако е получен друг клас или ако той е приятел на този клас, те не могат да бъдат предадени на тях.
Полиморфизъм
В # 61) Какво е полиморфизъм?
Отговор: Основната идея зад полиморфизма е в много форми. В C ++ имаме два вида полиморфизъм:
(i) Полиморфизъм по време на компилация
В полиморфизма по време на компилация постигаме много форми чрез претоварване. Следователно имаме претоварване на оператора и претоварване на функции. (Вече разгледахме това по-горе)
(ii) Полиморфизъм по време на изпълнение
Това е полиморфизмът за класове и обекти. Общата идея е, че базовият клас може да бъде наследен от няколко класа. Указателят на основен клас може да сочи към неговия дъщерен клас, а масивът от основен клас може да съхранява различни обекти на подчинен клас.
Това означава, че обектът реагира по различен начин на едно и също извикване на функция. Този тип полиморфизъм може да използва механизъм за виртуална функция.
В # 62) Какво представляват виртуалните функции?
Отговор: Виртуална функция позволява на производни класове да заменят изпълнението, предоставено от базовия клас.
Винаги, когато имаме функции с едно и също име в основата, както и в производен клас, възниква неяснота, когато се опитваме да осъществим достъп до обекта на дъщерния клас, използвайки указател на основен клас. Тъй като използваме указател на основен клас, функцията, която се извиква, е функцията на базовия клас със същото име.
За да коригираме тази неяснота, използваме ключовата дума „виртуален“ преди прототипа на функцията в базовия клас. С други думи, ние правим тази полиморфна функция виртуална. Използвайки виртуална функция, можем да премахнем неяснотата и да имаме достъп до всички функции на дъщерния клас правилно, използвайки указател на основен клас.
В # 63) Дайте пример за полиморфизъм / виртуални функции по време на изпълнение.
Отговор:
class SHAPE{ public virtual Draw() = 0; //abstract class with a pure virtual method }; class CIRCLE: public SHAPE{ public int r; public Draw() { this->drawCircle(0,0,r); } }; class SQUARE: public SHAPE{ public int a; public Draw() { this->drawSquare(0,0,a,a); } }; int main() { SHAPE shape1*; SHAPE shape2*; CIRCLE c1; SQUARE s1; shape1 = &c1; shape2 = &s1; coutВ горния код класът SHAPE има чисто виртуална функция и е абстрактен клас (не може да бъде инстанциран). Всеки клас е получен от SHAPE, реализиращ функцията Draw () по свой начин.
Освен това, всяка функция Draw е виртуална, така че когато използваме указател на основен клас (SHAPE) всеки път с обекта на производни класове (Circle и SQUARE), тогава се извикват подходящи Draw функции.
Q # 64) Какво имате предвид под Pure Virtual Functions?
Отговор: Функцията за чист виртуален член е функция-член, при която базовият клас принуждава производни класове да отменят. Обикновено тази функция член няма изпълнение. Чистите виртуални функции се приравняват на нула.
Пример:
class Shape { public: virtual void draw() = 0; };
Основният клас, който има чисто виртуална функция като негов член, може да бъде наречен „Абстрактен клас“. Този клас не може да бъде инстанциран и обикновено действа като план, който има няколко подкласа с по-нататъшно изпълнение.
В # 65) Какво представляват виртуалните конструктори / деструктори?
Отговор:
Виртуални деструктори: Когато използваме указател на основен клас, сочещ към обект на производен клас и го използваме, за да го унищожим, тогава вместо да извикаме деструктора на производен клас, се извиква деструкторът на базовия клас.
Пример:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Както е показано в горния пример, когато казваме изтриване на a, деструкторът се извиква, но всъщност това е деструкторът на базовия клас. Това поражда неяснотата, че цялата памет, задържана от b, няма да бъде изчистена правилно.
Този проблем може да бъде решен с помощта на концепцията „Виртуален деструктор“.
Това, което правим, е, че правим конструктора на базовия клас „Виртуален“, така че всички деструктори на дъщерния клас също да станат виртуални и когато изтрием обекта на базовия клас, сочещ към обекта на производния клас, се извиква подходящият деструктор и всички обектите са правилно изтрити.
Това е показано по следния начин:
как да отворя apk файлове
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Виртуален конструктор : Конструкторите не могат да бъдат виртуални. Декларирането на конструктор като виртуална функция е синтаксична грешка.
Приятел
Q # 66) Какво представлява функцията за приятелство?
Отговор: C ++ класът не позволява достъп до неговите частни и защитени членове извън класа. Но това правило може да бъде нарушено, като се използва „ Приятел ”Функция.
Както подсказва самото име, функцията за приятелство е външна функция, която е приятел на класа. За да може функцията „приятел“ да осъществява достъп до частните и защитени методи на класа, трябва да имаме прототип на функцията „приятел“ с ключовата дума „приятел“, включена в класа.
В # 67) Какво представлява класът на приятели?
Отговор: Приятелските класове се използват, когато трябва да заменим правилото за частни и защитени спецификатори за достъп, така че два класа да могат да работят в тясна връзка помежду си.
Следователно можем да имаме приятелски клас, който да бъде приятел на друг клас. По този начин класовете за приятели могат да запазят частни, недостъпни неща в начина, по който са.
Когато имаме изискване за достъп до вътрешното внедряване на клас (частен член), без да излагаме подробностите, като правим публични, ние се насочваме към приятелски функции.
Разширено C ++
Шаблони
В # 68) Какво представлява шаблонът?
Отговор: Шаблоните позволяват създаване на функции, които са независими от типа данни (общи) и могат да приемат всеки тип данни като параметри и да връщат стойност, без да се налага да претоварват функцията с всички възможни типове данни. Шаблоните почти изпълняват функционалността на макрос.
Неговият прототип е някой от следните:
шаблон идентифицират > декларация за функция;
шаблон идентифицират > декларация за функция;
Единствената разлика между двата прототипа е използването на ключова дума клас или име на тип. Тяхната основна функционалност да бъдат родови остава същата.
Обработка на изключения
В # 69) Какво представлява обработката на изключения? Поддържа ли C ++ обработка на изключения?
Отговор: Да C ++ поддържа обработка на изключения.
Не можем да гарантираме, че кодът ще се изпълнява нормално по всяко време. Възможно е да има определени ситуации, които могат да принудят написания от нас код да се повреди, въпреки че е без грешки. Тази неизправност на кода се нарича Изключение .
Когато възникне изключение, компилаторът трябва да го хвърли, за да знаем, че е възникнало изключение. Когато е хвърлено изключение, компилаторът трябва да гарантира, че с него се работи правилно, така че програмният поток да продължи или да прекрати правилно. Това се нарича обработка на изключение.
По този начин в C ++ имаме три ключови думи, т.е. опитвам , хвърляне и улов които са в обработка на изключения.
Общият синтаксис за блок за изключения е:
try{ …. # Code that is potentially about to throw exception goes here …. throw exception; } catch(exception type) { … #code to handle exception goes here }
Както е показано по-горе, кодът, който потенциално може да повреди, се поставя под блока try. Когато кодът се повреди, се извежда изключение. След това това изключение се улавя под блока за хващане и се обработва, т.е. се предприемат подходящи действия.
В # 70) Коментирайте стандартните изключения на C ++?
Отговор: C ++ поддържа някои стандартни изключения, които могат да бъдат уловени, ако поставим кода в блока try. Тези изключения са част от базовия клас „ std :: изключение ”. Този клас е дефиниран в заглавния файл на C ++.
Малко примери за изключения, поддържани от този клас, включват:
bad_alloc - хвърлен от ‘ново’
runtime_error - хвърлен за грешки по време на изпълнение
bad_typeid - изхвърлен от тип id
Въведение в стандартната библиотека с шаблони
В # 71) Какво представлява стандартната библиотека с шаблони (STL)? Какви са различните видове STL контейнери?
Отговор: Стандартна библиотека на шаблони (STL) е библиотека от шаблони на контейнери, одобрена от комитета ANSI за включване в стандартната спецификация на C ++. Имаме различни видове STL контейнери в зависимост от това как съхраняват елементите.
- Опашка, стек - Те са същите като традиционната опашка и стека и се наричат адаптивни контейнери.
- Set, Map - Това са основно контейнери, които имат двойки ключ / стойност и имат асоциативен характер.
- Vector и - Те имат последователен характер и имат сходство с масивите.
В # 72) Какво е клас на Iterator?
Отговор: В C ++ класът на контейнера е колекция от различни обекти.
Ако трябва да преминем през тази колекция от обекти, не можем да го направим с помощта на прости индексни променливи. Следователно имаме специален клас в STL, наречен Итератор клас, който може да се използва за преминаване през съдържанието на класа контейнер.
Различните категории итератори включват входни итератори, изходни итератори, препращащи итератори, двупосочни итератори, произволен достъп и др.
В # 73) Каква е разликата между външен итератор и вътрешен итератор? Опишете предимството на Външния итератор.
Отговор: Вътрешен итератор е реализиран с функции-членове на класа, които трябва да преминат през елементи.
Външен итератор е реализиран като отделен клас, който може да бъде свързан с обекта, който има елементи, през които да премине. Основното предимство на външен итератор е, че е лесен за изпълнение, тъй като е реализиран като отделен клас.
Второ, тъй като това е различен клас, много обекти на итератори могат да бъдат активни едновременно.
Допълнително четене => Въпроси за интервю за C #
Заключение
Почти всички основни теми за кодиране и програмиране на C ++ интервю са разгледани в тази статия.
Надяваме се, че всеки кандидат ще се почувства спокойно, след като се подготви за интервю, използвайки тази поредица от въпроси за интервю.
Всичко най-добро за вашето интервю !!
Препоръчително четене
- Интервюирайте въпроси и отговори
- Въпроси и отговори за интервю за ETL тестване
- Някои сложни ръчни тестови въпроси и отговори
- 25 най-добри пъргави тестови интервюта Въпроси и отговори
- Въпроси за интервю с Spock с отговори (най-популярни)
- Някои интересни въпроси за интервю за тестване на софтуер
- Топ 20+ .NET интервюта и отговори
- Топ 32 най-добри въпроси и отговори за интервю за сцената на данни