top 70 c interview questions
Найпоширеніші базові та вдосконалені запитання для співбесіди на C ++ із прикладами коду для кандидатів початкового рівня, а також досвідчених професіоналів:
Ця детальна стаття, безсумнівно, стане закладкою для тих, хто готується до співбесіди на C ++.
Тут висвітлено майже всі основні теми на C ++, а також деякі основні запитання щодо таких розширених тем, як бібліотека стандартних шаблонів (STL) тощо.
Цей набір питань кодування на C ++ допоможе вам впевнено зіткнутися з будь-яким інтерв’ю на C ++ та успішно його очистити з першої спроби.
Що ви дізнаєтесь:
- Запитання для співбесіди на C ++ із прикладами коду
Запитання для інтерв’ю на C ++ із прикладами коду
Нижче наведено найпопулярніші запитання для співбесіди з програмування на C ++, на які відповідає експерт з C ++.
Також читайте => Найпопулярніші запитання для співбесіди з програмування C
Базовий C ++
Структура програми C ++
Q # 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 ++ є два способи додавання коментарів:
- // однорядковий коментар
- / * блокувати коментар * /
Перший тип відкине все після того, як компілятор зустрінеться з “//”. У другому типі компілятор відкидає все між “/ *” та “* /”.
Змінні, типи даних і константи
Q # 3) Різниця між декларацією та визначенням змінної.
Відповідь: Оголошення змінної просто вказує тип даних змінної та ім'я змінної. В результаті оголошення ми повідомляємо компілятору зарезервувати місце для змінної в пам'яті відповідно до вказаного типу даних.
Приклад:
int Result; char c; int a,b,c;
Все вищезазначене є дійсними деклараціями. Також зауважте, що в результаті оголошення значення змінної не визначено.
Тоді як визначення - це реалізація / екземпляр оголошеної змінної, де ми прив’язуємо відповідне значення до оголошеної змінної, щоб лінкер міг пов’язати посилання на відповідні сутності.
Зверху Приклад ,
Результат = 10;
C = ‘A’;
Це дійсні визначення.
Q # 4) Коментар щодо локального та глобального обсягу змінної.
Відповідь: Сфера дії змінної визначається як обсяг програмного коду, в межах якого змінна залишається активною, тобто її можна оголосити, визначити або працювати з нею.
Існує два типи області застосування в C ++:
- Місцевий обсяг: Кажуть, що змінна має локальну область дії або є локальною, коли вона оголошена всередині блоку коду. Змінна залишається активною лише всередині блоку і недоступна поза блоком коду.
- Глобальний обсяг: Змінна має глобальний обсяг, коли вона доступна у всій програмі. Глобальна змінна оголошується поверх програми перед усіма визначеннями функцій.
Приклад:
#include Int globalResult=0; //global variable int main() { Int localVar = 10; //local variable. ….. }
Q # 5) Який пріоритет, коли в програмі є однакова іменна глобальна та локальна змінні?
Відповідь: Всякий раз, коли існує локальна змінна з тим самим іменем, що і глобальна змінна, компілятор надає перевагу локальній змінній.
Приклад:
#include int globalVar = 2; int main() { int globalVar = 5; cout<Результатом роботи вищезазначеного коду є 5. Це тому, що, хоча обидві змінні мають одне і те ж ім'я, компілятор надав перевагу локальній області.
Q # 6) Коли є глобальна змінна та локальна змінна з однаковим іменем, як ви отримаєте доступ до глобальної змінної?
Відповідь: Коли є дві змінні з однаковою назвою, але різною сферою дії, тобто одна є локальною, а інша - глобальною, компілятор надаватиме перевагу локальній змінній.
Для доступу до глобальної змінної ми використовуємо “ оператор роздільної здатності (: :) '. Використовуючи цей оператор, ми можемо отримати доступ до значення глобальної змінної.
Приклад:
#include int x= 10; int main() { int x= 2; cout<<”Global Variable x = “<<::x; cout<<”
local Variable x= “< Вихід:
Глобальна змінна x = 10
локальна змінна x = 2
Q # 7) Скільки способів ініціалізувати int за допомогою Constant?
Відповідь: Є два шляхи:
- Перший формат використовує традиційні позначення C.
int результат = 10; - Другий формат використовує нотацію конструктора.
результат int (10);
Константи
Q # 8) Що таке константа? Поясніть на прикладі.
Відповідь: Константа - це вираз, який має фіксоване значення. Їх можна розділити на цілі, десяткові, константи з плаваючою комою, символи або рядки залежно від їх типу даних.
Окрім десяткової, C ++ також підтримує ще дві константи, тобто восьмеричну (до основи 8) та шістнадцяткову (до основи 16) константи.
Приклади констант:
- 75 // ціле число (десяткове)
- 0113 // восьмеричний
- 0x4b // шістнадцяткове
- 3.142 // з плаваючою комою
- ‘C’ // символьна константа
- “Привіт, світе” // рядкова константа
Примітка: Коли нам потрібно представити один символ, ми використовуємо одинарні лапки, а коли хочемо визначити константу з кількома символами, використовуємо подвійні лапки.
Q # 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;
У наведених вище прикладах, коли тип константи не вказаний, компілятор С ++ за замовчуванням встановлює цілочисельний тип.
Оператори
Q # 10) Коментар до оператора присвоєння в C ++.
Відповідь: Оператор присвоєння в C ++ використовується для присвоєння значення іншій змінній.
a = 5;
Цей рядок коду присвоює ціле число 5 до змінної до .
Частина зліва від оператора = відома як lvalue (ліве значення), а праве як rvalue (правильне значення). L значення завжди має бути змінною, тоді як права сторона може бути константою, змінною, результатом операції або будь-якої їх комбінації.
Операція присвоєння завжди відбувається справа наліво і ніколи не навпаки.
Однією з властивостей С ++ над іншими мовами програмування є те, що оператор присвоєння може використовуватися як rvalue (або частина rvalue ) для іншого завдання.
Приклад:
a = 2 + (b = 5);
еквівалентно:
b = 5;
a = 2 + b;
Що означає, спочатку призначте 5 до змінної b а потім призначити до, значення два плюс результат попереднього виразу b (тобто 5), листя до з кінцевим значенням 7 .
Таким чином, такий вираз також є дійсним у C ++:
a = b = c = 5;
призначити 5 змінним до , b і c .
Q # 11) Яка різниця між рівним (==) та Оператором присвоєння (=)?
Відповідь: У C ++ рівне (==) та оператор присвоєння (=) - два абсолютно різних оператора.
Дорівнює (==) - це реляційний оператор рівності, який обчислює два вирази, щоб перевірити, чи рівні вони, і повертає true, якщо вони рівні, і false, якщо вони не є.
Оператор присвоєння (=) використовується для присвоєння значення змінній. Отже, ми можемо мати складну операцію присвоєння всередині реляційного оператора рівності для оцінки.
Q # 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, а результат операції - це залишок ділення.
Q # 13) Які різні складені оператори присвоєння в 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;
Q # 14) Вкажіть різницю між операціями з попереднього та подальшого збільшення / зменшення.
Відповідь: С ++ дозволяє два оператори, тобто ++ (приріст) та - (зменшення), які дозволяють додати 1 до існуючого значення змінної та відняти 1 від змінної відповідно. Ці оператори в свою чергу називаються приростом (++) та зменшенням (-).
Приклад:
a = 5;
a ++;
Друге твердження, ++, призведе до додавання 1 до значення a. Таким чином, ++ еквівалентно
a = a + 1; або
a + = 1;
Унікальною особливістю цих операторів є те, що ми можемо додати до цих операторів префікс або суфікс зі змінною. Отже, якщо a є змінною, і ми додаємо оператору приросту префікс, це буде
++ a;
Це називається попереднім збільшенням. Так само ми маємо попереднє зменшення.
Якщо ми додамо змінну а до оператора приросту, ми матимемо,
a ++;
Це постінкремент. Так само ми маємо пост-декремент.
Різниця між значенням pre і post залежить від того, як оцінюється вираз і зберігається результат.
У випадку оператора попереднього збільшення / зменшення спочатку виконується операція збільшення / зменшення, а потім результат передається в значення lvalue. Тоді як для операцій після збільшення / зменшення спочатку обчислюється значення l, а потім відповідно виконується збільшення / зменшення.
Приклад:
a = 5; b = 6;
++ a; # a = 6
b–; # b = 6
–A; # a = 5
b ++; №6
Введення / виведення через консоль
Q # 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 -
cout<<”Hello, World!”; cout<<123;
Структури та функції управління
Структури управління та петлі
Q # 16) Яка різниця між циклом while і do while? Поясніть на прикладах.
Відповідь: Формат циклу while в C ++:
Поки (вираз)
{твердження;}
Блок операторів під while виконується до тих пір, поки умова в даному виразі є істинним.
Приклад:
#include int main() { int n; cout<>n; while(n>0) { cout<<” “<У наведеному вище коді цикл безпосередньо вийде, якщо n дорівнює 0. Таким чином, у циклі while завершальна умова знаходиться на початку циклу, і якщо воно виконане, жодні ітерації циклу не виконуються.
Далі ми розглянемо цикл виконання.
Загальним форматом виконуваної роботи є:
do {твердження;} while (умова);
Приклад:
#include int main() { int n; cout<>n; do { cout<У наведеному вище коді ми бачимо, що оператор всередині циклу виконується принаймні один раз, оскільки умова циклу знаходиться в кінці. Це основні відмінності між тимчасовим та реальним часом.
У випадку циклу while ми можемо безпосередньо вийти з циклу на початку, якщо умова не виконується, тоді як у циклі do-while ми виконуємо оператори циклу принаймні один раз.
Функції
Q # 17) Що ви маєте на увазі під типом повернення 'void'?
Відповідь: Усі функції повинні повертати значення відповідно до загального синтаксису.
Однак, якщо ми не хочемо, щоб функція повертала якесь значення, ми використовуємо “ порожнеча ”, Щоб вказати на це. Це означає, що ми використовуємо “ порожнеча ', Щоб вказати, що функція не має поверненого значення або вона повертає' порожнеча '.
Приклад:
void myfunc() { Cout<<”Hello,This is my function!!”; } int main() { myfunc(); return 0; }
Q # 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 = “< Вихід:
х = 2
y = 6
z = 8
Як показано вище, модифікації, внесені до параметрів у викликаних функціях, передаються викликаючій функції, коли ми використовуємо техніку «Передати за посиланням». Це пов’язано з тим, що за допомогою цієї техніки ми не передаємо копію параметрів, але насправді передаємо саме посилання на змінну.
Q # 19) Що таке параметри за замовчуванням? Як вони оцінюються у функції C ++?
Відповідь: Параметр за замовчуванням - це значення, яке присвоюється кожному параметру під час оголошення функції.
Це значення використовується, якщо цей параметр залишається порожнім під час виклику функції. Щоб вказати значення за замовчуванням для певного параметра, ми просто призначаємо значення параметру в декларації функції.
Якщо значення цього параметра не передається під час виклику функції, тоді компілятор використовує вказане значення за замовчуванням. Якщо вказано значення, то це значення за замовчуванням наступає і використовується передане значення.
Приклад:
int multiply(int a, int b=2) { int r; r = a * b; return r; } int main() { Cout< Вихід:
12
6
Як показано у наведеному вище коді, є два виклики функції множення. У першому виклику передається лише один параметр зі значенням. У цьому випадку другим параметром є вказане значення за замовчуванням. Але у другому виклику, оскільки обидва значення параметрів передаються, значення за замовчуванням замінюється і використовується передане значення.
Q # 20) Що таке вбудована функція в C ++?
Відповідь: Вбудована функція - це функція, яка компілюється компілятором як точка виклику функції, і код заміщується в цій точці. Це робить компіляцію швидшою. Ця функція визначається префіксом прототипу функції із ключовим словом “inline”.
Такі функції вигідні лише тоді, коли код вбудованої функції невеликий і простий. Хоча функція визначається як Inline, вона повністю залежить від компілятора, щоб оцінити її як вбудовану чи ні.
Структура розширених даних
Масиви
Q # 21) Чому масиви, як правило, обробляються за допомогою циклу for?
Відповідь: Масив використовує індекс для обходу кожного з його елементів.
Якщо A є масивом, тоді кожен з його елементів отримує доступ як A (i). Програмно все, що для цього потрібно, - це ітераційний блок із змінною циклу i, який служить індексом (лічильником) із збільшенням від 0 до A.length-1.
Це саме те, що робить цикл, і саме тому ми обробляємо масиви за допомогою циклів for.
Q # 22) Вкажіть різницю між видаленням та видаленням ().
Відповідь: “Delete ()” використовується для звільнення пам’яті, виділеної масиву, який був виділений за допомогою new (). “Delete” використовується для звільнення одного фрагмента пам’яті, виділеного за допомогою new.
Q # 23) Що не так із цим кодом?
T * p = новий T (10);
видалити p;
Відповідь: Вищезазначений код синтаксично правильний і буде скомпільований чудово.
Єдина проблема полягає в тому, що він просто видалить перший елемент масиву. Незважаючи на те, що весь масив видалений, буде викликаний лише деструктор першого елемента і звільнена пам'ять для першого елемента.
Q # 24) У якому порядку руйнуються об’єкти в масиві?
Відповідь: Об'єкти в масиві руйнуються у зворотному порядку побудови: спочатку побудовані, останні знищені.
програмне забезпечення для онлайн-резервного копіювання для постачальників послуг
У наступному прикладі, порядок для деструкторів буде a (9), a (8),…, a (1), a (0):
voiduserCode() { Car a(10); ... }
Покажчики
Q # 25) Що не так із цим кодом?
Т * р = 0;
видалити p;
Відповідь: У наведеному вище коді покажчик є нульовим покажчиком. Відповідно до стандарту C ++ 03, цілком справедливим є виклик видалення за вказівником NULL. Оператор видалення буде дбати про перевірку NULL внутрішньо.
Q # 26) Що таке посилальна змінна в C ++?
Відповідь: Посилальна змінна - це псевдонім для існуючої змінної. Це означає, що і ім'я змінної, і посилальна змінна вказують на одне і те ж розташування пам'яті. Отже, щоразу, коли змінна оновлюється, посилання також оновлюється.
Приклад:
int a=10; int& b = a;
Тут b - посилання на a.
Класи зберігання
Q # 27) Що таке клас зберігання? Згадайте класи зберігання в C ++.
Відповідь: Клас зберігання визначає термін служби або область дії таких символів, як змінна або функції.
C ++ підтримує такі класи зберігання:
- Авто
- Статичні
- Зовнішні
- Зареєструйтесь
- Змінний
Q # 28) Поясніть специфікатор класу Mutable Storage.
Відповідь: Змінну елемента об’єкта константи-класу змінити не можна. Однак, оголосивши змінні 'змінними', ми можемо змінити значення цих змінних.
Q # 29) Для чого призначене ключове слово auto?
Відповідь: За замовчуванням кожна локальна змінна функції є автоматичною, тобто авто . У наведеній нижче функції як змінні «i», так і «j» є автоматичними змінними.
void f() { int i; auto int j; }
ПРИМІТКА : Глобальна змінна не є автоматичною змінною.
Q # 30) Що таке статична змінна?
Відповідь: Статична змінна - це локальна змінна, яка зберігає своє значення під час викликів функції. Статичні змінні оголошуються за допомогою ключового слова “static”. Числові змінні, які є статичними, мають значення за замовчуванням рівне нулю.
Наступна функція надрукує 1 2 3, якщо вона буде тричі викликана.
void f() { static int i; ++i; printf(“%d “,i); }
Якщо глобальна змінна статична, то її видимість обмежена тим самим вихідним кодом.
Q # 31) Яка мета специфікатора зовнішнього сховища?
Відповідь: Специфікатор “Extern” використовується для вирішення сфери дії глобального символу.
#include using nam espace std; main() { extern int i; cout< У наведеному вище коді “i” може бути видно поза файлом, де він визначений.
Q # 32) Поясніть специфікатор сховища реєстру.
Відповідь: Змінна “Зареєструвати” повинна використовуватися щоразу, коли використовується змінна. Коли змінну оголошено специфікатором “register”, тоді компілятор видає регістр CPU для її зберігання, щоб пришвидшити пошук змінної.
Q # 33) Коли використовувати аргументи посилання “const” у функції?
Відповідь: Використання аргументів посилання “const” у функції вигідне кількома способами:
- “Const” захищає від помилок програмування, які можуть змінити дані.
- В результаті використання “const” функція здатна обробляти як const, так і non-const фактичні аргументи, що неможливо, коли не використовується “const”.
- Використання посилання const дозволить функції генерувати та використовувати тимчасову змінну відповідним чином.
Структура та визначені користувачем типи даних
Q # 34) Що таке клас?
Відповідь: Клас - це визначений користувачем тип даних у C ++. Його можна створити для вирішення конкретного виду проблем. Після створення користувач не повинен знати подробиці роботи класу.
Загалом клас діє як проект проекту і може включати в себе різні параметри та функції або дії, що діють на ці параметри. Їх називають членами класу.
Q # 35) Різниця між класом та структурою.
Відповідь:
Структура: Мовою С ця структура використовується для об’єднання різних типів типів даних разом. Змінні всередині структури називаються членами структури. Ці члени за замовчуванням є загальнодоступними, і доступ до них можна отримати за допомогою назви структури, за якою стоїть оператор крапки, а потім імені члена.
Клас: Клас є наступником Структури. C ++ розширює визначення структури, включаючи функції, які діють на її членів. За замовчуванням усі учасники класу є приватними.
Об'єктно-орієнтоване програмування на C ++
Класи, конструктори, деструктори
Q # 36) Що таке простір імен?
Відповідь: Простір імен дозволяє згрупувати набір глобальних класів, об'єктів та / або функцій під певною назвою.
Загальною формою використання просторів імен є:
ідентифікатор простору імен {простір імен}
Де ідентифікатор - це будь-який дійсний ідентифікатор, а тіло простору імен - це набір класів, об'єктів та функцій, що входять до простору імен. Простори імен особливо корисні в тому випадку, коли існує можливість для більш ніж одного об'єкта мати одне і те ж ім'я, що призводить до зіткнень імен.
Q # 37) Яка користь від декларації 'using'?
Відповідь: Використання Декларації використовується для посилання на ім'я з простору імен без оператора роздільної здатності.
Q # 38) Що таке Манглінг імен?
Відповідь: Компілятор С ++ кодує типи параметрів за допомогою функції / методу в унікальне ім'я. Цей процес називається перекручуванням імен. Зворотний процес називається дементуванням.
Приклад:
A :: b (int, long) const спотворений як ‘B__C3Ail’ .
Для конструктора ім'я методу не вказано.
Це A :: A (int, long) const спотворений як 'C3Ail'.
Q # 39) Яка різниця між об’єктом та класом?
Відповідь: Клас - це проект проекту чи проблеми, який потрібно вирішити, і складається із змінних та методів. Їх називають членами класу. Ми не можемо отримати доступ до методів або змінних класу самостійно, якщо вони не оголошені статичними.
Для того, щоб отримати доступ до членів класу та використати їх, ми повинні створити екземпляр класу, який називається Object. Клас має необмежену тривалість життя, тоді як об’єкт має обмежену тривалість життя.
Q # 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
Q # 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. }
Q # 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 }
Q # 43) Що таке конструктор за замовчуванням?
Відповідь: Конструктор за замовчуванням - це конструктор, який або не має аргументів, або якщо вони є, то всі вони є аргументами за замовчуванням.
Приклад:
class B { public: B (int m = 0) : n (m) {} int n; }; int main(int argc, char *argv()) { B b; return 0; }
Q # 44) Що таке конструктор перетворень?
Відповідь: Це конструктор, який приймає один аргумент іншого типу. Конструктори перетворення в основному використовуються для перетворення одного типу в інший.
Q # 45) Що таке явний конструктор?
Відповідь: Конструктор перетворення оголошується із явним ключовим словом. Компілятор не використовує явний конструктор для реалізації неявного перетворення типів. Його призначення явно зарезервовано для будівництва.
Q # 46) Яка роль ключового слова Static для змінної члена класу?
Відповідь: Статична змінна-член використовує спільну пам'ять для всіх об'єктів, створених для відповідного класу. Нам не потрібно посилатися на статичну змінну-член за допомогою об'єкта. Однак до нього можна отримати доступ, використовуючи саму назву класу.
Q # 47) Поясніть функцію статичного члена.
Відповідь: Функція статичного члена може отримати доступ лише до змінної статичного члена класу. Як і статичні змінні члена, до функції статичного члена також можна отримати доступ за допомогою імені класу.
Q # 48) У якому порядку руйнуються локальні об’єкти?
Відповідь: Розгляньте наступний фрагмент коду:
Class A{ …. }; int main() { A a; A b; ... }
У головній функції ми маємо два об’єкти, створені один за одним. Вони створюються в порядку, спочатку а потім b. Але коли ці об'єкти видаляються або якщо вони виходять за межі області дії, деструктор для кожного буде викликаний у зворотному порядку, в якому вони були побудовані.
Отже, деструктор b буде викликаний спочатку, а потім a. Навіть якщо ми маємо масив об’єктів, вони будуть знищені однаково у зворотному порядку їх створення.
Перевантаження
Q # 49) Поясніть перевантаження функції та перевантаження оператора.
Відповідь: C ++ підтримує концепцію ООП поліморфізм, що означає «багато форм».
У C ++ ми маємо два типи поліморфізму, тобто поліморфізм під час компіляції та поліморфізм під час виконання. Поліморфізм під час компіляції досягається за допомогою техніки перевантаження. Перевантаження просто означає надати сутності додатковий зміст, зберігаючи його базове значення незмінним.
C ++ підтримує два типи перевантаження:
Перевантаження функції:
Перевантаження функцій - це техніка, яка дозволяє програмісту мати більше однієї функції з однаковим іменем, але різним списком параметрів. Іншими словами, ми перевантажуємо функцію різними аргументами, тобто будь то тип аргументів, кількість аргументів або порядок аргументів.
Перевантаження функції ніколи не досягається за її повернутим типом.
Перевантаження оператора:
Це ще один тип поліморфізму під час компіляції, який підтримується C ++. При перевантаженні оператора оператор перевантажується, щоб він міг працювати як із визначеними користувачем типами, так і з операндами стандартного типу даних. Але при цьому стандартне визначення цього оператора залишається незмінним.
Наприклад, оператор додавання (+), який оперує числовими типами даних, може бути перевантажений для роботи з двома об'єктами, як і об'єкт класу складних чисел.
Q # 50) Яка різниця між перевантаженням методу та перевизначенням методів у C ++?
Відповідь: Перевантаження методу - це наявність функцій з однаковим іменем, але різними списками аргументів. Це форма поліморфізму під час компіляції.
Заміщення методу з’являється, коли ми переписуємо метод, який походить від базового класу. Заміна методу використовується під час роботи з поліморфізмом часу виконання або віртуальними функціями.
Q # 51) У чому різниця між конструктором копіювання та перевантаженим Оператор присвоєння?
Відповідь: Конструктор копіювання та перевантажений оператор присвоєння в основному служать одній і тій же меті, тобто призначенню вмісту одного об'єкта іншому. Але все ж між ними є різниця.
Приклад:
complex c1,c2; c1=c2; //this is assignment complex c3=c2; //copy constructor
У наведеному вище прикладі другий оператор c1 = c2 є перевантаженим оператором призначення.
Тут і c1, і c2 - це вже існуючі об’єкти, а вміст c2 присвоюється об’єкту c1. Отже, для перевантаженого оператора присвоєння обидва об’єкти повинні бути вже створені.
Наступне твердження, комплекс c3 = c2, є прикладом конструктора копіювання. Тут вміст c2 присвоюється новому об’єкту c3, що означає, що конструктор копіювання створює новий об’єкт кожного разу при його виконанні.
Q # 52) Назвіть операторів, які неможливо перевантажити.
Відповідь:
- sizeof - розмір оператора
- . - Точковий оператор
- . * - оператор розстановки посилань
- -> - оператор перенаправлення членів
- :: - оператор роздільної здатності
- ?: - умовний оператор
Q # 53) Функція може бути перевантажена на основі параметра, який є значенням або посиланням. Поясніть, чи твердження відповідає дійсності.
Відповідь: Помилковий. І передавання значення, і передача посилання виглядають ідентично абоненту.
Q # 54) Які переваги перевантаження оператора?
Відповідь: Перевантажуючи стандартні оператори класу, ми можемо розширити значення цих операторів, щоб вони могли також оперувати іншими визначеними користувачем об'єктами.
Перевантаження функцій дозволяє нам зменшити складність коду та зробити його більш зрозумілим та читабельним, оскільки ми можемо мати однакові імена функцій з різними списками аргументів.
Спадщина
Q # 55) Що таке спадкування?
Відповідь: Спадкування - це процес, за допомогою якого ми можемо набути характеристик існуючого об’єкта та сформувати новий об’єкт, додавши до нього більше можливостей.
З точки зору C ++, успадкування створює новий клас, виводячи його з існуючого класу, щоб цей новий клас мав властивості свого батьківського класу, а також власних.
Q # 56) Які переваги спадкування?
Відповідь: Спадкування дозволяє повторно використовувати код, тим самим економить час на розробку коду.
Успадковуючи, ми використовуємо високоякісне програмне забезпечення без помилок, яке зменшує майбутні проблеми.
Q # 57) Чи підтримує C ++ багаторівневе та багатоспадкове спадкування?
Відповідь: Так.
Q # 58) Що таке множинні спадщини (віртуальне успадкування)? Які його переваги та недоліки?
Відповідь: У кількох спадкоємствах ми маємо більше одного базового класу, з якого похідний клас може успадковувати. Отже, похідний клас приймає особливості та властивості більш ніж одного базового класу.
Наприклад , клас водій матиме два базових класи, а саме, працівник і особа, оскільки водій - це як працівник, так і людина. Це вигідно, оскільки клас драйвера може успадкувати властивості працівника, а також клас людини.
Але у випадку працівника та людини клас матиме деякі спільні властивості. Однак виникне неоднозначна ситуація, оскільки клас драйвера не знатиме класів, від яких слід успадковувати загальні властивості. Це головний недолік множинних спадкоємств.
Q # 59) Поясніть взаємозв'язки класів ISA та HASA. Як би ви реалізували кожен?
Відповідь: Відносини “ISA” зазвичай демонструють успадкування, оскільки це означає, що клас “ISA” спеціалізується на версії іншого класу. Наприклад , Працівник ISA. Це означає, що клас Employee успадковується від класу Person.
На відміну від “ISA”, відношення “HASA” показує, що сутність може мати інший об’єкт як свого члена або клас має інший об’єкт, вбудований всередину.
Отож, беручи той самий приклад класу Employee, ми пов’язуємо клас Salary із працівником не шляхом його успадкування, а шляхом включення або утримання об’єкта Salary всередині класу Employee. Взаємозв'язок 'HASA' найкраще демонструється шляхом стримування або агрегування.
Q # 60) Чи похідний клас успадковує чи не успадковує?
Відповідь: Коли похідний клас будується з певного базового класу, він в основному успадковує всі функції та звичайні члени базового класу. Але з цього правила є деякі винятки. Наприклад, похідний клас не успадковує конструктори та деструктори базового класу.
Кожен клас має свої конструктори та деструктори. Похідний клас також не успадковує оператор присвоєння базового класу та друзів класу. Причина полягає в тому, що ці сутності специфічні для певного класу, і якщо інший клас є похідним або якщо він є другом цього класу, тоді вони не можуть бути передані їм.
Поліморфізм
Q # 61) Що таке поліморфізм?
Відповідь: Основна ідея поліморфізму полягає у багатьох формах. У C ++ ми маємо два типи поліморфізму:
(i) Поліморфізм під час компіляції
У поліморфізмі під час компіляції ми досягаємо багатьох форм, перевантажуючи. Отже, ми маємо перевантаження оператора та функцію перевантаження. (Ми вже висвітлювали це вище)
(ii) Поліморфізм під час виконання
Це поліморфізм класів та об’єктів. Загальна ідея полягає в тому, що базовий клас може успадковуватися декількома класами. Покажчик базового класу може вказувати на його дочірній клас, а масив базового класу може зберігати різні об'єкти дочірнього класу.
Це означає, що об'єкт по-різному реагує на один і той же виклик функції. Цей тип поліморфізму може використовувати віртуальний механізм функцій.
Q # 62) Що таке віртуальні функції?
Відповідь: Віртуальна функція дозволяє похідним класам замінити реалізацію, передбачену базовим класом.
Всякий раз, коли у нас є функції з однаковим іменем як в базовому, так і в похідному класі, виникає неоднозначність при спробі отримати доступ до об'єкта дочірнього класу за допомогою покажчика базового класу. Оскільки ми використовуємо вказівник базового класу, функцією, яка викликається, є функція базового класу з тим самим іменем.
Щоб виправити цю неоднозначність, ми використовуємо ключове слово “virtual” перед прототипом функції в базовому класі. Іншими словами, ми робимо цю поліморфну функцію віртуальною. Використовуючи віртуальну функцію, ми можемо усунути неоднозначність і отримати правильний доступ до всіх функцій дочірнього класу за допомогою вказівника базового класу.
Q # 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) Що ви маєте на увазі під чисто віртуальними функціями?
Відповідь: Функція чистого віртуального члена - це функція-член, в якій базовий клас змушує похідні класи замінювати. Зазвичай ця функція-член не має реалізації. Чисті віртуальні функції прирівнюються до нуля.
Приклад:
class Shape { public: virtual void draw() = 0; };
Базовий клас, який має виключно віртуальну функцію як свого члена, можна назвати 'абстрактним класом'. Цей клас не може бути створений, і він, як правило, діє як проект, який має кілька підкласів з подальшим впровадженням.
Q # 65) Що таке віртуальні конструктори / деструктори?
Відповідь:
Віртуальні деструктори: Коли ми використовуємо вказівник базового класу, що вказує на похідний об'єкт класу, і використовуємо його для його знищення, тоді замість виклику похідного деструктора класу викликається деструктор базового класу.
Приклад:
Class A{ …. ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Як показано у наведеному вище прикладі, коли ми говоримо видалити a, деструктор викликається, але насправді це деструктор базового класу. Це породжує двозначність, що вся пам’ять, що зберігається b, не буде очищена належним чином.
Цю проблему можна вирішити за допомогою концепції “Віртуальний деструктор”.
Що ми робимо, ми робимо конструктор базового класу “Віртуальним”, щоб усі деструктори дочірнього класу також ставали віртуальними, і коли ми видаляємо об’єкт базового класу, вказуючи на об’єкт похідного класу, викликається відповідний деструктор і всі об’єкти належним чином видаляються.
Це показано наступним чином:
що таке активація портів проти переадресації портів
Class A{ …. virtual ~A(); }; Class B:publicA{ … ~B(); }; B b; A a = &b; delete a;
Віртуальний конструктор : Конструктори не можуть бути віртуальними. Оголошення конструктора як віртуальної функції є синтаксичною помилкою.
Друже
Q # 66) Що таке функція друга?
Відповідь: Клас С ++ забороняє доступ до приватних та захищених членів поза класом. Але це правило можна порушити, використовуючи “ Друже ”Функція.
Як випливає з назви, функція “друг” - це зовнішня функція, яка є другом класу. Щоб функція friend мала доступ до приватних та захищених методів класу, ми повинні мати прототип функції friend із ключовим словом “friend”, включеним всередину класу.
Q # 67) Що таке клас друзів?
Відповідь: Класи друзів використовуються, коли нам потрібно замінити правило приватних і захищених специфікаторів доступу, щоб два класи могли тісно взаємодіяти між собою.
Отже, ми можемо мати друга, щоб бути другом іншого класу. Таким чином, класи друзів можуть зберігати приватні, недоступні речі такими, якими вони є.
Коли ми маємо вимогу отримати доступ до внутрішньої реалізації класу (приватного члена) без викриття деталей, роблячи загальнодоступним, ми використовуємо функції друзів.
Розширений C ++
Шаблони
Q # 68) Що таке шаблон?
Відповідь: Шаблони дозволяють створювати функції, які не залежать від типу даних (загальні) і можуть приймати будь-який тип даних як параметри та повертати значення, не перевантажуючи функцію усіма можливими типами даних. Шаблони майже відповідають функціональності макросу.
Його прототипом є будь-який із наступних:
шаблон визначити > оголошення_функції;
шаблон визначити > оголошення_функції;
Єдина різниця між обома прототипами полягає у використанні класу ключових слів або імені типу. Їх основна функціональність як загального залишається незмінною.
Обробка винятків
Q # 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 }
Як показано вище, код, який може призвести до несправності, поміщається під блок спроби. При несправності коду виникає виняток. Потім цей виняток перехоплюється під блоком catch і обробляється, тобто вживаються відповідні дії.
Q # 70) Коментувати стандартні винятки на C ++?
Відповідь: C ++ підтримує деякі стандартні винятки, які можна виявити, якщо ми помістимо код всередину блоку try. Ці винятки є частиною базового класу “ std :: виняток ”. Цей клас визначено у файлі заголовка C ++.
Кілька прикладів винятків, які підтримує цей клас, включають:
bad_alloc - кинуто 'новим'
runtime_error - видається для помилок під час виконання
bad_typeid - видається за типом id
Вступ до бібліотеки стандартних шаблонів
Q # 71) Що таке стандартна бібліотека шаблонів (STL)? Які існують різні типи контейнерів STL?
Відповідь: Стандартна бібліотека шаблонів (STL) - це бібліотека шаблонів контейнерів, затверджена комісією ANSI для включення до стандартної специфікації C ++. У нас є різні типи контейнерів STL залежно від того, як вони зберігають елементи.
- Черга, стек - Вони однакові з традиційною чергою та стеком і називаються адаптивними контейнерами.
- Набір, карта - Це в основному контейнери, які мають пари ключ / значення та мають асоціативний характер.
- Вектор, та - Вони мають послідовний характер і мають схожість з масивами.
Q # 72) Що таке клас Iterator?
Відповідь: У C ++ клас контейнера - це сукупність різних об'єктів.
Якщо нам потрібно здійснити обхід цієї колекції об’єктів, ми не можемо зробити це, використовуючи прості змінні індексу. Отже, у нас є спеціальний клас в STL, який називається Ітератор клас, за допомогою якого можна переходити через вміст класу контейнера.
До різних категорій ітераторів належать вхідні ітератори, вихідні ітератори, прямі ітератори, двонаправлені ітератори, довільний доступ тощо.
Q # 73) Яка різниця між зовнішнім ітератором та внутрішнім ітератором? Опишіть перевагу Зовнішнього ітератора.
Відповідь: Внутрішній ітератор реалізований з функціями-членами класу, які мають елементи, які потрібно пройти.
Зовнішній ітератор реалізований у вигляді окремого класу, який може бути прив'язаний до об'єкта, який має елементи для переходу. Основною перевагою зовнішнього ітератора є те, що його легко реалізувати, оскільки він реалізований як окремий клас.
По-друге, оскільки це інший клас, багато об’єктів-ітераторів можуть бути активними одночасно.
Подальше читання => Запитання для співбесіди на C #
Висновок
У цій статті висвітлено майже всі основні теми кодування та програмування співбесіди на C ++.
Ми сподіваємось, що будь-який кандидат почуватиметься розслаблено після підготовки до співбесіди, використовуючи цю серію запитань.
Все найкраще для Вашого Інтерв’ю !!
Рекомендована література
- Запитання та відповіді на інтерв’ю
- Запитання та відповіді на інтерв’ю для тестування ETL
- Деякі хитрі ручні тестування Питання та відповіді
- 25 найкращих запитань та відповідей на інтерв’ю для спритного тестування
- Запитання для інтерв’ю у Spock (найпопулярніші)
- Деякі цікаві запитання щодо тестування програмного забезпечення
- Топ 20+ запитань та відповідей на інтерв’ю .NET
- Найкращі 32 запитання та відповіді на інтерв’ю на етапі обробки даних