Date Редакция Категория comp Теги Cpp

В чем разница между указателем и ссылкой?

Указатель — это переменная, представляющая собой адрес другой переменной. Ссылка — это другое имя переменной на которую она ссылается.

Ссылки отличаются от указателей в следующем:

  • ссылки не могут быть NULL; каждая ссылка ссылается на некий объект, вне зависимости от его корректности;
  • ссылки не могут быть неинициализированными, поэтому их нужно инициализировать сразу же после создания;
  • невозможно напрямую сослаться на ссылку; каждое упоминание ссылки напрямую представляет объект, на который она ссылается;
  • созданную ссылку нельзя переопределить, то есть перевести на другой объект;
  • в качестве результата первого указания не могут быть выполнены никакие арифметические вычисления, приведения типов, взятия адреса и т. п.

В чем разница между локальными и динамическими (выделенными оператором new) переменными? Как называются области памяти, где эти переменные хранятся?

Локальные переменные, не созданные при помощи new, являются статическими, в том смысле, что их количество, размерности и суммарный объем известны еще при трансляции и не могут быть изменены при выполнении программы. Такие переменные размещаются в стеке.

Динамические переменные создаются во время работы программы в области памяти, называемой «кучей». Динамическая переменная не имеет имени, доступ к ней возможен только через указатель. При этом, хотя указатель хранит адрес, принадлежащей куче, сам он, являясь локальной переменной, хранится в стеке.

В чем отличие malloc от new?

  • new выделяет память и вызывает конструктор создаваемого класса, malloc только выделяет память.
  • new возвращает значение типа «указатель-на-объект», а malloc — «указатель-на-что-угодно» (void *).
  • для освобождения памяти, выделенной new, используется delete; для освобождения памяти после malloc используется free.
  • в случае неудачи new может бросить исключение, malloc возвращает NULL (в зависимости от значения константы nothrow, new также может вернуть нулевой указатель).

В чем различия между delete и delete[]?

delete[] нужно писать тогда, когда освобождается память, выделенная под массив объектов оператором new[]. delete — тогда, когда освобождается память, выделенная под единичный объект оператором new.

Дайте определения следующим понятиям: класс, поле, метод.

  • Класс — это тип данных, включающий определенный набор функций для работы с элементами этого типа.
  • Поле класса — переменная, в которой хранятся данные объекта или класса.
  • Метод – это функция, определенная в классе.

Чем отличается класс от объекта? От структуры?

Класс определяет новый тип. Объект — переменная этого нового типа. Класс и объект соотносятся как чертеж изделия и готовое изделие, выполненное по чертежу. Кроме того, класс объявляется один раз, а объектов этого класса создаётся столько, сколько необходимо.

В классе все поля по умолчанию приватны, а в структуре – публичны.

Объясните смысл терминов: инкапсуляция, наследование, полиморфизм.

  • Инкапсуляция – сокрытие деталей реализации класса.
  • Наследование — механизм языка, позволяющий описать новый класс на основе уже существующего (базового) класса.
  • Полиморфизм — единообразная обработка разнотипных данных.

Сколько места в памяти занимает объект класса? Как это узнать?

Объект будет занимать в памяти места не меньше, чем все его поля, кроме статических.

Кроме того, к размеру объекта могут будут добавлены: указатели на виртуальные функции, размер нестатических полей базовых классов, а также пробелы, добавленные компилятором для выравнивания данных.

Узнать размер класса можно с помощью sizeof(class).

Что обозначается ключевым словом this?

this является указателем на объект, для которого вызван метод.

Чем отличается статический метод от обычного?

Статический метод можно вызывать для класса независимо от того, определён ли хотя бы один объект этого класса: class::staticmethod(). Поскольку статический метод не «приписан» к объекту, он не получает указателя this в качестве параметра.

Статические методы не могут быть константными или виртуальными.

В чем отличие между статическим и нестатическим полем класса?

Обычное (нестатическое) поле для каждого объекта класса имеет свое значение. Значение статического поля одно для всех объектов класса.

Для каких целей применяется ключевое слово const?

  • Позволяет задать константность объекта.
  • Позволяет задать константность указателя.
  • Позволяет указать, что данный метод не модифицирует поля класса, т. е. сохраняет состояние объекта.

Дайте определение дружественной функции.

Дружественная функция — это внешняя функция, имеющая доступ к скрытым полям класса.

Для чего используются ключевые слова public, private и protected? Что их применение дает при наследовании?

Ключевое слово public открывает доступ извне к полям класса, а private — закрывает. protected делает отмеченные им поля доступными только классам-наследникам данного.

Указывают способ наследования: открытое, закрытое или защищенное.

  • Что такое виртуальный метод. Зачем нужны виртуальные методы?
  • Что такое чисто виртуальный метод и абстрактный класс? Зачем они нужны?
  • Каков порядок вызова конструкторов? А деструкторов?
  • Зачем нужен виртуальный деструктор?
  • Назовите ключевые слова С++, которые используются для обработки исключений.
  • Что такое шаблоны и для чего они предназначены?


Комментарии

comments powered by Disqus