Рубрики

Часто задаваемые вопросы об интервью C ++ | Комплект 1

Каковы различия между C и C ++?
1) C ++ — это своего рода надмножество C, большинство программ на C, за исключением нескольких исключений (Смотрите это и это ) также работает в C ++.
2) C — это процедурный язык программирования, но C ++ поддерживает как процедурное, так и объектно-ориентированное программирование.
3) Поскольку C ++ поддерживает объектно-ориентированное программирование, он поддерживает такие функции, как перегрузка функций, шаблоны, наследование, виртуальные функции, функции-друзья. Эти функции отсутствуют в C.
4) C ++ поддерживает обработку исключений на уровне языка, в C обработка исключений выполняется в традиционном стиле if-else.
5) C ++ поддерживает ссылки , C — нет.
6) В C, scanf () и printf () в основном используются для ввода / вывода. C ++ в основном использует потоки для выполнения операций ввода и вывода. cin — это стандартный поток ввода, а cout — стандартный поток вывода.

Есть еще много отличий, выше приведен список основных отличий.

Каковы различия между ссылками и указателями?
И ссылки, и указатели могут использоваться для изменения локальных переменных одной функции внутри другой функции. Оба они также могут быть использованы для сохранения копирования больших объектов, когда они передаются в качестве аргументов функциям или возвращаются из функций, чтобы получить выигрыш в эффективности.
Несмотря на вышеуказанное сходство, между ссылками и указателями есть следующие различия.

Ссылки менее мощные, чем указатели
1) Как только ссылка создана, она не может быть позже сделана для ссылки на другой объект; это не может быть повторно установлено. Это часто делается с помощью указателей.
2) Ссылки не могут быть NULL. Указатели часто имеют значение NULL, чтобы указать, что они не указывают ни на одну действительную вещь.
3) Ссылка должна быть инициализирована при объявлении. Там нет такого ограничения с указателями

Из-за вышеуказанных ограничений ссылки в C ++ не могут использоваться для реализации структур данных, таких как Linked List, Tree и т. Д. В Java ссылки не имеют вышеуказанных ограничений и могут использоваться для реализации всех структур данных. Ссылки, являющиеся более мощными в Java, являются основной причиной, по которой Java не нуждается в указателях.

Ссылки безопаснее и проще в использовании:
1) Безопаснее: поскольку ссылки должны быть инициализированы, дикие ссылки, такие как дикие указатели, вряд ли существуют. Все еще возможно иметь ссылки, которые не относятся к действительному местоположению (см. Вопросы 5 и 6 в упражнении ниже)
2) Легче в использовании: для доступа к значению для ссылок не требуется оператор разыменования. Их можно использовать как обычные переменные. Оператор '&' необходим только во время объявления. Кроме того, к элементам ссылки на объект можно получить доступ с помощью оператора точки ('.'), В отличие от указателей, где для доступа к элементам необходим оператор стрелки (->).

Что такое виртуальные функции — напишите пример?
Виртуальные функции используются с наследованием, они вызываются в соответствии с типом объекта, на который указывают или ссылаются, а не в соответствии с типом указателя или ссылки. Другими словами, виртуальные функции разрешаются поздно, во время выполнения. Виртуальное ключевое слово используется, чтобы сделать функцию виртуальной.

Для написания программы на C ++ с полиморфизмом во время выполнения (использование виртуальных функций) необходимо следующее.
1) Базовый класс и производный класс.
2) Функция с тем же именем в базовом классе и производном классе.
3) Указатель или ссылка на тип базового класса, указывающая или ссылающаяся на объект производного класса.

Например, в следующей программе bp является указателем типа Base, но вызов bp-> show () вызывает функцию show () класса Derived, поскольку bp указывает на объект класса Derived.

#include<iostream>

using namespace std;

  

class Base {

public:

    virtual void show() { cout<<" In Base \n"; }

};

  

class Derived: public Base {

public:

    void show() { cout<<"In Derived \n"; } 

};

  

int main(void) {   

    Base *bp = new Derived;     

    bp->show();  // ВРЕМЕННЫЙ ПОЛИМОРФИЗМ

    return 0;

}

Выход:

In Derived

Что это за указатель?
Указатель 'this' передается как скрытый аргумент всем вызовам нестатических функций-членов и доступен как локальная переменная в теле всех нестатических функций. Указатель this является постоянным указателем, который содержит адрес памяти текущего объекта. Указатель 'this' недоступен в статических функциях-членах, так как статические функции-члены могут вызываться без какого-либо объекта (с именем класса).

Можем ли мы сделать «удалить это»?
Смотрите http://espressocode.top/delete-this-in-c/

Что такое VTABLE и VPTR?
vtable — это таблица указателей на функции. Поддерживается на класс.
vptr это указатель на vtable. Он поддерживается для каждого объекта (см. Пример).
Компилятор добавляет дополнительный код в двух местах для поддержки и использования vtable и vptr.
1) Код в каждом конструкторе. Этот код устанавливает vptr создаваемого объекта. Этот код устанавливает vptr для указания на vtable класса.
2) Код с полиморфным вызовом функции (например, bp-> show () в приведенном выше коде). Где бы ни происходил полиморфный вызов, компилятор вставляет код, чтобы сначала искать vptr, используя указатель или ссылку на базовый класс (в приведенном выше примере, поскольку указанный или ссылочный объект имеет производный тип, доступ к vptr из производного класса). После получения vptr можно получить доступ к vtable производного класса. Используя vtable, вызывается адрес производной функции класса show () и вызывается.

Вам также может понравиться:

Скоро мы расскажем больше о C ++. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Часто задаваемые вопросы об интервью C ++ | Комплект 1

0.00 (0%) 0 votes