C вопросы на собеседовании

В процессе подготовки к удаленному собеседованию составил список возможных вопросов по Net. В результате ответы на треть вопросов уже были готовы. Вопросы и ответы под катами. Надеюсь, помогут 🙂

TOP Вопросы на засыпку

10. «Какие типы можно использовать в предложении foreach?»
Массивы, коллекции. Классы в которых реализован интерфейс System.Collections.IEnumerable.
9. «В чем различие между классом и структурой?» —
Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).
8.
то означает модификатор virtual?».

При наследовании класса. Данный метод м.б. переопределен в производных классах с помощью ключевого слова override.
7. «Чем отличается event от delegate?»
Delegate – это по сути указатель на функцию
В С# модель издатель — подписчик, где класс публикует событие, которое он может инициировать, и любые классы могут подписаться на это событие. Метод, вызываемый при возникновении события, определяется делегатом
6. «Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?»
Да.
public class GiuseppePizzaria : IWindow, IRestaurant {
// Реализация метода GetMenu интерфейса IWindow.
Object IWindow.GetMenu() { … }
// Реализация метода GetMenu интерфейса IRestaurant.
Object IRestaurant.SetMenu() { … }
// Метод GetMenu, не относящийся к интерфейсам.
5. «Что такое GAC?»
Global Assembly Cache
4. «В чем разница инкапсуляции и сокрытия?»
Инкапсуляция предполагает формирование классов, т.е. размещение в одном месте сразу и структур данных, и методов. Инкапсуляция также предполагает установку области видимости структур данных и методов от использования их вне класса, в частности сокрытие данных и методов использую private.
3. «Что такое частные и общие сборки?» -.
Частные находятся в каталоге программы, а общие в GAC
2. «Что такое .Net Framework?»
Общеязыковая исполняющая среда common language runtime (CLR) + и библиотека классов framework class library (FCL).
1. «Чем managed code отличается от unmanaged code?» —
Это означает, что CLR заботится об управлении памятью, о совместимости между платформами, о безопасности кода и так далее Это хорошо описано у Рихтера.


Общие вопросы

1. Поддерживает ли C# множественное наследование?
gdr_live: С# поддерживает множественное наследование в виде наследования от класса и нескольких интерфейсов, или просто от нескольких интерфейсов.
Но не поддерживает наследование от нескольких классов.
2. Кому доступны переменные с модификатором protected на уровне класса?
Любому классу-наследнику.
3. Наследуются ли переменные с модификатором private?
Да, но они не являются доступными.
4. Опишите модификатор “protected internal”.
Члены с таким модификатором доступны классам, находящимся в той же сборке и унаследованным от данного класса.
5. Назовите класс .NET, от которого наследуются все классы?
System.Object.
6. Что обозначает термин immutable (неизменяемый)?
Это значит, что данные, хранящиеся в переменной, не могут быть изменены. При этом заметьте, что значение переменной может быть изменено — путём отказа от использования старых данных, которые могут быть изменены.
Оригинальные данные остаются в памяти, а новые значения создаются вновь, в новой области памяти.
имер тип String
7. Какая разница между классами System.String и System.Text.StringBuilder?
Данные, хранящиеся в классе System.String и есть неизменяемые (immutable). Класс System.StringBuilder разрабатывался так, чтобы над изменяемой строкой можно было проделать множество операций. То есть при каждой операции над объектом класса System.String происходит перенос данных в новую область памяти, что влияет на производительность программы.
8. Какое преимущество использования класса System.Text.StringBuilder перед System.String?
Класс StringBuilder более эффективен в случае работы с большим количеством строк. Объекты класса System.String неизменяемы, поэтому при каждом изменении строки создаётся новый объект в памяти.
9. Можно ли хранить разные типы данных в объекте класса System.Array?
C вопросы на собеседованииaz_spb_ru

static void Main(string[] args) {  object[] arr = new object[] { "string", 0, new Guid() };  foreach (object var in arr)  {  Console.WriteLine(var.GetType().ToString());  }  Console.ReadKey();  double d = 0.0;  ValueType[] arr2 = new ValueType[] { d, 0, new Guid() };  foreach (ValueType var in arr2)  {  Console.WriteLine(var.GetType().ToString());  }  Console.ReadKey();  }  

10. Объясните разницу между System.Array.CopyTo() и System.Array.Clone()?
Первая операция осуществляет глубокое копирование массива, а вторая – поверхностное.
верхностное копирование массива копирует только сами элементы объекта класса Array, независимо от того являются они ссылочными или значимыми типами.
Копирования объектов, на которые ссылаются ссылочные типы не происходит. Ссылки в новом объекте класса Array указывают на те же объекты, что и ссылки в оригинальном массиве Array. Глубокое копирование копирует как элементы класса Array, так и объекты, на которые они явно или неявно ссылаются.
11. Как отсортировать элементы массива в убывающем порядке?
Нужно вызвать метод Sort(), а затем метод Reverse().
12. Какой класс коллекций в .NET позволяет получить доступ к элементу с использованием уникального ключа?
HashTable.
13. Какой класс используется в реализации класса SortedList?
Этот класс является гибридом классов HashTable и Array.
14. Будет ли выполнен блок finally, если не было сгенерировано исключение?
Да.
15. Какой синтаксис нужно использовать в C# для отлова любого возможного исключения?
Блок catch, отлавливающий исключения типа System.Exception. Также можно просто использовать catch{}, не указывая тип исключения.
16. Можно ли выполнить несколько блоков catch дляодного оператора try?
Нет. Как только отработал один блок, управление передаётся в блок finally (если такой есть).
17. Назовите три составных части модели известной как трёхуровневое приложение.
БД-серверная часть – клиент
18.
, is – что это, как применяется?

Операторы приведения типов.
If(o is Employee){
Employee e = (Employee) o;
}
Проверка типа осущ., 2-ды. По этому в CLR
Employee e = o as Employee;
If(e != null){
}
19. Какое место в иерархии типов .net занимает CString
System.String, CString это из MFC
20. Как реализованы в .Net простые типы: (вроде int etc…)
marat_yuldashev: В виде структур

Вопросы по классам

1. Какой синтаксис используется для указания класса родителя в C#?
После имени класса наследника нужно поставить двоеточие и указать имя базового класса.
Пример: class ChildClass : ParentClass
2. Можно ли запретить наследование от своего собственного класса?
Да. Для этого служит ключевое слово “sealed”.
3. Можно ли разрешить наследование класса, но запретить перекрытие метода?
Да. Указываем класс как public, а метод как sealed.
4. Что такое абстрактный класс?
Это класс, объект которого не может быть создан. Такой класс должен иметь класс-наследник с реализацией абстрактных методов. Абстрактный класс – это фактически чертёж нормального класса без реализации.
5. В каком случае вы обязаны объявить класс абстрактным?
1. В том случае, если класс является наследником абстрактного класса, но не все методы базового класса перекрыты и имеют реализацию.
2.
том случае, если хотя бы один метод класса является абстрактным.
6. Что такое интерфейс класса?
Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но, в отличие от классов, они не содержат их реализации. Интерфейсы реализуются классами и определяются как самостоятельные сущности.
7. Почему нельзя указать модификатор видимости для методов интерфейса?
Потому что все они должны иметь модификатор public, который и установлен по умолчанию.
8. Можно ли наследовать от нескольких интерфейсов?
Да. .NET поддерживает такое наследование.
9. Назовите отличия между интерфейсом и абстрактным классом?
В интерфейсе все методы (свойства и т.д.) абстрактны и не имеют реализации. В абстрактном классе некоторые методы могут быть реализованы. В интерфейсе члены не могут иметь модификатора видимости (все они являются public по умолчанию), а в абстрактном классе члены могут иметь модификатор видимости.
10. Назовите различия между структурами и классами.
Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).
11.
зовите концепции ООП.

Концепции ООП строятся на базе трех основных принципов: 1) инкапсуляция 2)наследование 3)полиморфизм.
Инкапсуляция – это совмещение структур данных с функциями (методами), манипулирующими этими данными. Фактически, инкапсуляция предполагает размещение в одном месте сразу и структур данных, и методов.
Наследование – это создание новых классов, которые строятся на базе структур данных и методов уже существующих классов (базовых). В качестве примера рассмотрим windows-окно. Сначала строится класс стандартного windows-окна.
Полиморфизм – это использование одного имени или идентификатора для метода внутри одной иерархии класса таким образом, чтобы для разных классов этой иерархии этот метод реализовывал различные операции. Функция становится виртуальной, если перед ее объявление поставить спецификатор «virtual».
12. В чем разница между абстрактными и виртуальными классами? Между виртуальными и абстрактными методами?
Абстрактный класс это класс, содержащий хотя бы один метод (abstract)..
Виртуальный метод имеет реализацию и м.б. переопределен в производном классе. Абстрактный метод не имеет реализацию, только описание метода, который д.б. реализован в производных классах.
13. Dispose(), Finalize() – что это за методы, как используются в .NET?
Используются для освобождения ресурсов.
именяя метод Dispose, вы должны обеспечить неявную очистку методом Finalize. Если программисту не удалось вызвать метод Dispose, использование метода Finalize предотвращает постоянную утечку ресурсов.
14. Для чего в .NET используется конструкция using(…){…}? Причем тут IDisposable?
Значение Using непосредственно связано с интерфейсом IDisposable. Интерфейс IDisposable представляет нам возможность быстро освободить общие ресурсы, не полагаясь на автоматический сборщик мусора (garbage collector).
Конструкция Using позволяет вызывать метод Dispose автоматически, как только нужный объект выйдет за блок Using.

Вопросы по методам и свойствам

1. Назовите явное имя параметра, передаваемого в метод set свойства класса?
value. Тип этого параметра определяется типом свойства.
2. Что обозначает ключевое слово “virtual” для метода или свойства?
То, что метод или свойство может быть перекрыто.
3. Чем перекрытый метод отличается от перегруженного метода?
При перекрывании метода мы изменяем его поведение в классе наследнике. Перегрузка метода просто приводит к использованию другого метода с тем же именем внутри класса.
4. Можно ли объявить перекрытый метод статическим, если перекрываемый метод не является статическим?
Нет. Сигнатура виртуального метода должна остаться постоянной, кроме замены ключевого слова virtual на ключевое слово override.
5. Какими способами может быть перегружен метод?
Другой тип параметров, другое количество параметров, другой порядок параметров. Фактически всё может быть другим, кроме имени.
6. Если в базовом классе существует несколько перегруженных конструкторов и в классе-наследник есть несколько перегруженных конструкторов, можно ли вызвать конструктор базового класса из конструктора класса-наследника?
Да, можно.


События и делегаты

1. Что такое делегат?
Делегат – это объект, инкапсулирующий ссылку на метод. Аналог указатель указателя на функцию
2. Что такое групповой делегат?
Делегаты сами по себе невероятно полезны, но поддержка цепочек делает их еще полезнее. Я уже сказал, что у каждого объекта MulticastDelegate есть закрытое поле _prev. В этом поле хранится ссылка на другой объект MulticastDelegate, т. е. каждый объект типа MulticastDelegate (и любого типа, производного от него) обладает ссылкой на другой объект-потомок MulticastDelegate. Это поле позволяет объекту делегата становиться частью связного списка.

Вопросы по XML-документации

1. Является ли XML регистрочувствительным (т.е. различает ли он прописные и строчные буквы)?
Да.
2. Какая разница между комментариями
//комментарий,
/*комментарий*/ и
///комментарий?
Комментарий, который располагается на одной строке, на нескольких строках и комментарий для XML-документации.
3. Как можно сгенерировать документацию из файла на C#, содержащего корректно сформированные комментарии с помощью компилятора командной строки?
Опция /doc: компилятора C#
CSC.exe


Вопросы по отладке и тестированию

1. Какие инструменты отладки входят в .NET SDK?
CorDBG – отладчик командной строки. Для использования этой утилиты нужно скомпилировать файл C# с ключом /debug.
DbgCLR – отладчик с графическим интерфейсом. Visual Studio .NET использует DbgCLR.
2. Каково различие между классами Debug и Trace?
Документация выглядит одинаково. Однако, рекомендуется использовать класс Debug для сборки в режиме отладки, а Trace – как для отладки, так и для окончательной сборки.
3. Зачем в классе System.Diagnostics.TraceSwitcher нужны пять уровней трассировки?
Дампы трассировки могут быть очень большими. Отсюда возникает риск нехватки места на диске для постоянно работающих приложений. Пять уровней трассировки от None (ничего) до Verbose (всё) позволяют настроить хранящуюся трассировочную информацию точно в соответствии с нашими нуждами.
4. Куда перенаправляется вывод класса TextWriter-TraceListener?
На консоль или в текстовый файл, в зависимости от параметра, переданного конструктору.
5. Каким образом происходит отладка приложения ASP.NET?
Путем подсоединения процесса aspnet_wp.exe к отладчику DbgClr.
6. Какие три типа тестов вы должны выполнить в процессе тестирования сборки?
1. Позитивный тест (корректные данные – корректный вывод).
2. Негативный тест (некорректные или неполные данные – корректная обработка).
3. Исключительный тест (генерация исключений и их корректная обработка).
7. Можно ли изменить значение переменной во время отладки приложения C#?
Да.
8. Что выведет этот код (чур в студию не подглядывать! :):

XmlDocument x = new XmlDocument();
x.LoadXml(" ");
Console.WriteLine(x.ToString());
Console.ReadKey();

marat_yuldashev: пример тип – объект — string

Вопросы по ADO.net и БД

1. Какова роль класса DataReader в ADO.NET?
Этот класс возвращает набор данных, доступный только для чтения с навигацией только вперёд. DataReader – самый быстрый способ получения данных.
2. Какие преимущества и недостатки классов-поставщиков данных, предлагаемых Microsof в ADO.NET?
Поставщик данных SQLServer.NET – высокоскоростной и устойчивый, но для него необходима лицензия на SQL Server от Microsoft. OLE-DB.NET является универсальным поставщиком для доступа к данным из других источников, таких как Oracle, DB2, Microsoft Access и Informix. OLE-DB.NET – это .NET-слой поверх слоя OLE, поэтому он не так быстр и эффективен, как SqlServer.NET.
3. Назовите групповой символ в SQL?
Если мы хотим сделать запрос к БД с LIKE для всех работников, чьё имя начинается с La, то групповым символом будет %,соответственно параметром для LIKE будет ‘La%’.
4. Расскажите о правиле ACID для транзакций.
Транзакция должна быть:
1. Атомарной (Atomic) – результат её работы не должен зависеть от предыдущих и следующих транзакций.
2. Согласованной (Consistent) – данные или записаны или не записаны, не должно быть промежуточного состояния после окончания транзакции.
3. Изолированность (Isolated) – транзакции не видят промежуточных результатов текущей транзакции.
4. Надёжность (Durable) – значения сохраняются, если данные записаны, а система рушится сразу после этого.
5. Какие соединения поддерживаются Microsoft SQL Server?
Соединения с аутентификацией Windows (посредством Active Directory) и SQL Server (через имя пользователя и пароль Microsoft SQL Server).
6. Если сравнивать аутентификацию Windows и SQL Server, какое из них будет доверенным, а какое – нет?
Аутентификация Windows является доверенной, поскольку пароль и имя пользователя проверяются Active Directory, а аутентификация SQL Server не является доверенной, поскольку только SQL Server проверяет логин и пароль, принимающие участие в транзакции.
7. Какое значение имеет параметр Initial Catalog в строке соединения?
Имя базы данных, к которой происходит подсоединение.
8. Какими являются требования для использования пула соединений?
???

Вопросы по сборкам

1. Каким образом в .NET решена проблема «DLL Hell»?
GAC.
2. Каким образом можно распространять сборки?
2 вида сборок со строгим(с ключом) и нестрогим именем.
3. Что такое «сопутствующая сборка» (satellite assembly)?
Сборки, помеченные определенными региональными стандартами, называются
сателлитными сборками
5. Какая наименьшая исполнимая единица в .NET?
сборка
6. Когда необходимо вызывать сборщик мусора в .NET?
Вызывается автоматически.
7. Как конвертировать значимый тип в ссылочный?
Int32 x = 5;
Object о = x;
8. Что происходит в памяти при упаковке и распаковке значимого типа?
При упаковке экземпляра размерного типа происходит следующее.
1. В управляемой куче выделяется память. Ее объем определяется длиной размерного типа и некоторыми накладными расходами, позволяющими этому размерному типу стать настоящим объектом. Этими накладными расходами являются указатель на таблицу методов и индекс SyncBlocklndex.
2. Поля размерного типа копируются в память, выделенную только что в куче.
3. Возвращается адрес объекта. Этот адрес является ссылкой на объект; размерный тип превратился в ссылочный.
Распаковка не является точной противоположностью упаковки.
Она состоит только в получении указателя на исходный.
размерный тип (поля данных), содержащийся в объекте. И никакого копирования при распаковке (в отличие от упаковки). Однако обычно вслед за распаковкой выполняется копирование полей, поэтому в сумме обе эти операции являются отражением операции упаковки

surfingbird.ru

Предисловие

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

Сегодня состоялось собеседование по скайпу с сотрудниками компании. Собеседование я, с большой долей вероятности, провалил. Прежде всего из-за элементарного недостатка знаний по некоторым деталям. Хотя, пару-тройку вопросов я элементарно не додумал. Так часто бывает в обстановке экзамена 🙂

В целом, надо сказать, что собеседование было очень простым. И я предполагал, что все будет гораздо страшнее. По опыту собеседования в наших местных аутсортинговых компаниях, скажу, что, по уровню сложности, это было на троечку.

Также, хочу добавить, что я крайне отрицательно отношусь к собеседованиям вообще. Во-первых, мало кто в состоянии вести себя на собеседованиях адекватно. Как не крути, а наличествует некоторый стресс. Даже в случае, если ты пришел на собеседование просто так, для "пощекотать нервы" (Думаю, что многие согласятся с тем, что надо всегда находится в поиске и не отказываться априори от того, что может сулить какие-то перспективы. Пусть и несбыточные.) Во-вторых, умение писать код и разбираться в вопросах на собеседовании не проверить. Для этого надо обязательно проводить тестовое задание.

Как бы там не было, думаю, что многим интересны будут вопросы, которые могут задать по профилю C/C++/Linux. Именно этим профилем занимаюсь я, и именно по этому профилю было проведено собеседование, отчёт о котором я хочу здесь представить.

Ниже я привожу практические и теоретические вопросы, которые были заданы вперемешку, но, которые, я, тем не менее, сгруппировал именно в такой последовательности. Целью было максимально разделить постановку практических вопросов от комментариев к ним.

Практические вопросы

Системный вызов fork(), стандартные потоки ввода/вывода

  1. Что вы можете сказать о следующем фрагменте кода? Есть ли в нем ошибки? Дайте максимальные комментарии о работе этого кода.
  2. Откомпилируется ли представленный фрагмент кода? Если откомпилируется, то что будет при запуске?
  3. Нужно ли изменить программу в строке с вызовом fprintf(), чтобы надпись "Hello" печаталась два раза? Если нужно, то как?
  4. Нужно ли изменить программу в строке с вызовом fprintf(), чтобы надпись "Hello" печаталась один раз? Если нужно, то как?
 #include <stdio.h>  int main() {  fprintf(0, "Hello");  fork();  return 0; } 

Знаковые и беззнаковые типы разной ёмкости

Что будет лежать в A после исполнения следующего фрагмента кода?

 int A = 128; char B = A;  A = B; 

Виртуальный деструктор

Что будет напечатано при исполнении следующего фрагмента кода? Максимально прокомментируйте этот код. Есть ли в нем принципиальные ошибки и, если есть, то как их исправить?

 #include <iоstreаm>  using nаmespаce std;  class Fаther {  public:  Fаther() {}  ~Fаther()   {  cоut << "~Father" << endl;  }  };   class Sоn : public Fаther {  public:  Sоn() : Fаther()   {   }  ~Sоn()   {   cоut << "~Son" << endl;  } };  int mаin() {  Fаther* оbject = new Sоn();  delete оbject; } 

Игры с указателями

Что будет содержаться в массиве a после исполнения представленного ниже кода?

 char a[]="111111111111"; *((int*)a+1) = 0; 

Односвязный список

Представьте себе односвязный список. Если у вас есть указатель на произвольный элемент этого списка, то сможете ли вы написать алгоритм корректного удаления этого элемента из списка? Т.е. такого удаления, при котором не нарушается связанность левой и правой частей списка.

Теоретические вопросы

Теоретические вопросы я оставлю практически без комментариев. Они достаточно чёткие в своей постановке и если кто-то чего-то не знает, то может найти это в литературе или в сети Интернет без особых проблем.

  1. Что такое виртуальная память? Что в процессоре ответственно за реализацию виртуальной памяти?
  2. Что вы можете рассказать об архитектурах CISC и RISC? Основные особенности и различия.
  3. Как работают системные вызовы? Как переносятся параметры системного вызова?
  4. Расскажите о системном вызове fork(). Что передается в копию процесса?
  5. Что такое виртуальный конструктор?
  6. Сколько таблиц виртуальных методов может быть в объекте класса? От чего это зависит? Что можно сказать о размещении указателей на них?
  7. Можно ли в конструкторе вызывать виртуальные методы?
  8. Что вы можете рассказать о различиях между std::vector и std::list в плане их внутренней реализации?
  9. Как должен быть оформлен класс, чтобы его объекты могли храниться в std::vector?
  10. Чем отличается процесс от потока?
  11. Разделяют ли потоки стек?
  12. Что такое мьютекс? Что такое семафор? Можно ли семафор использовать для синхронизации процессов?
  13. Какие вы знаете средства взаимодействия процессов? Могут ли процессы иметь общую память?

Хочу дать единственный комментарий к вопросу о количестве таблиц виртуальных методов. Прежде чем отвечать наверняка вспомните и подумайте о множественном наследовании. Здесь вас могут легко запутать.

Комментарии к практическим вопросам

Системный вызов fork(), стандартные потоки ввода/вывода

 #include <stdio.h>  int main() {  fprintf(0, "Hello");  fork();  return 0; } 

Конечно же в представленном коде есть ошибки. Прежде всего, нулевой указатель на поток не приведет ни к чему хорошему, учитывая, что здесь, очевидно, хотят сделать вывод строки в поток. Такой код откомпилируется, так как синтаксически он корректен, но приведет к segmentation fault.

Если в качестве потока вывода указать поток stdout, т.е. написать fprintf(stdout, "Hello"), то надпись будет выведена два раза, так как поток stdout буферизируется и при создании копии процесса, также будет сделана копия буферов stdout. Поэтому, при завершении обоих процессов, буферы каждого будут сброшены и на терминале появятся две надписи "Hello".

Если в качестве потока вывода указать поток stderr, т.е. написать fprintf(stderr, "Hello"), то надпись будет выведена только один раз, так как поток stderr не буферизован и поступившие в него данные сразу будут выброшены на устройство вывода связанное с данным потоком. Функция fork() будет выполнена только после этого.

Знаковые и беззнаковые типы разной ёмкости

Что будет лежать в A после исполнения следующего фрагмента кода?

 int A = 128; char B = A;  A = B; 

Тип char представляет собой знаковый однобайтовый тип, поэтому число 128, которое будет в него записано будет интерпретироваться как отрицательное число в дополнительном коде. Следовательно, при обратном присвоении мы получим число (-128).

Виртуальный деструктор

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

Ситуация представленная в этом примере является более чем "классикой жанра" и может быть найдена в любом пособии при разговоре о виртуальных деструкторах.

Игры с указателями

 char a[]="111111111111"; *((int*)a+1) = 0; 

Имя массива в C/C++ является адресом его начального элемента. Приведя этот адрес к указателю на целое число мы получаем указатель на следующие четыре байта целого (для вычислительных систем, где int занимает четыре байта). Инкремент этого указателя сдвигает адрес указателя на четыре байта (столько занимает начальный элемент массива из элементов типа int). Следовательно разыменуемый адрес указывает на четыре байта памяти, сдвинутые относительно исходного адреса на четыре байта. После обнуления этих четырех байт мы получим, что в массиве a будет лежать "1111000000001111". В этой записи, согласно стандарту Си, литерал '00' представляет собой восьмиричную запись однобайтового значения.

Односвязный список

Вот по поводу этого вопроса я ничего сказать не могу. Априори был уверен, что сделать это нельзя. На собеседовании меня уверили, что можно. Буду думать. Если придумаю, то может найду время написать об этом.

Некоторые из тех, кому я уже рассказал об этой задачке предполагают, что речь идёт о кольцевом односвязном списке. Однако слово "кольцевой" в вопросе, насколько я помню, не звучало. Как умолчание я бы посчитал это нелепицей. Да и если речь идёт о кольцевом односвязном списке, то это было бы слишком просто. Хотя, судя по тому, что все вопросы были достаточно простые, то, может быть, так оно и есть.

И еще один момент. Я специально спрашивал насчёт указателя на начало списка. Указатель не дали. И ещё раз уточнили. Дан односвязный список и указатель только на тот внутренний элемент списка, которые требуется корректно удалить. В общем, выглядит задачка как полный бред. Как заметил один мой коллега, Дубровин Алексей, за эту задачу компании должна быть назначена премия Тьюринга по теме "Как утечку памяти превратить в связанный список" :).

Спустя неделю. Прошла неделя с момента публикации этого сообщения и я подумал, что имеет смысл опубликовать размышление моих коллег по этой задаче. Сначала коллеги из "Мирантис", потом Михаил Сёмичев из "ЕПАМ" (все это наши местные отделения распределенных аутсортинговых компаний) и, наконец, Владимир Легкий из компании "Волга-софт" предположили, что возможно речь идет о следующем решении. Если не заниматься движениями указателей, а выполнить смещение данных относительно удаляемого элемента, то решение получается простое, но имеет одно ограничение. Оно не работает для случая, если указатель задачи указывает на последний элемент.

Поясню решение. Оно может быть в нескольких вариантах, но в одной сути.

Один из вариантов предпологает, что мы выполним циклический сдвиг данных по элементам списка относительно указываемого элемента. Тогда данные из указываемого элемента пропадут (чем не удаление элемента), а два последних элемента списка будут иметь одинаковые продублированные данные. Последний элемент, в этом случае, мы можем без проблем удалить.

В другом, более хитром и более эффективном применении идеи о перемещении данных, мы можем сделать полную копию следующего элемента в указываемый по задаче. Т.е. буквально сделать memcpy(). Перед этим надо сохранить указатель на следующий элемент с тем, чтобы после выполнения "сырой" копии удалить следующий элемент.

knzsoft.blogspot.com

Как можно оптимизировать данный цикл?

Вот таким образом:

В исходном цикле каждый раз происходит вычисление позиции элемента в массиве array. Переписав функцию мы избавляемся от этого вычисления.

В чем отличие std::list<T> от std::vector<T>?

std::vector<T> — это обертка над обычным С/C++ массивом. Соответственно:

  • если std::vector<T> заполнен, то при добавлении нового элемента, массив удаляется целиком и создается заново с бОльшим размером
  • любой элемент массива можно получить моментально, потому что позиция элемента вычисляется банальным прибавлением индекса к первому элементу (array[i] = array + i)
  • удаление любого элемента из массива, кроме последнего, приведет к перемещению всех элементов справа от удаляемого на одну позицию влево (при соблюдении некоторых условий, можно воспользоваться хаком)
  • занимает неразрывный блок памяти

std::list<T> — это список элементов, которые связаны между собой указателями prev (предыдущий элемент) и next (следующий элемент). Внутри себя std::list<T> хранит указатель на первый элемент и последний (зависит от реализации). Исходя из этого:

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

В языке Java различия между ArrayList и LinkedList практически такие же.

Почему в C++ нужно использовать new вместо теплого лампового malloc()?

Потому что malloc() тупо выделяет блок памяти и возвращает этот блок программисту. А new выделяет память и вызывает конструктор объекта. Тоже самое относится к delete и free(). delete вызывает деструктор и освобождает память. free() просто освобождает память. Также есть размещающий new, который создает объект в уже выделенной вами памяти.

Кстати, изначально конструкторы и деструкторы классов в C++ назывались new и delete и выглядели вот так:

В чем отличие между new/delete и new[]/delete[]?

new выделяет память для одного элемента и вызывает конструктор для него, в то время как new[] выделяет память для массива элементов и вызывает конструктор для каждого из них. delete должен вызываться для объекта выделенного с помощью new, а delete[] для массива, выделенного с помощью new[]. От проблем соответствия new/delete вас могут избавить классы std::auto_ptr<T> (для одного элемента) и std::tr1::scoped_array<T> (для массива элементов). Которые сами вызывают правильный delete в деструкторе.

Для чего нужен тип std::auto_ptr<T>?

В стародавние времена вы должны были сами следить за тем, чтоб после каждого new был вызван свой delete. Это было жутко неудобно (программисты Си выкручиваются из этой ситуации вставляя goto):

После появление std::auto_ptr<T> стало возможным переписать функцию таким образом:

И еще очень важный момент: std::auto_ptr<T> владеет объектом единолично. Вы не сможете шарить объект между двумя std::auto_ptr<T> (используйте в таких случаях std::shared_ptr<T>):

И помните: std::auto_ptr<T> не подходит для массивов выделенных с помощью new[]. Для этих целей используйте std::tr1::scoped_array<T> или boost::scoped_array<T>.

Что такое RAII?

Это переводится как «Получение ресурса есть инициализация». Идея вкратце такая: в конструкторе открываем/блокируем ресурс, в деструкторе закрываем/освобождаем ресурс. Вот пример:

Или более каноничный пример (блокирование мьютекса или критической секции):

Зачем нужен виртуальный деструктор?

Попробуем обойтись без него:

Вывод:

Как можно заметить деструктор B не вызвался. Сделаем деструктор класса A виртуальным и посмотрим что получится:

Теперь все отлично:

В каком порядке инициализируются члены класса?

Члены класса создаются в порядке их объявления в классе. Уничтожаются они в обратном порядке. Давайте проверим:

Запустим:

Все правильно.

Порядок объявления очень важен, если один член класса во время инициализации использует данные другого члена. Кстати, компилятор gcc выдает warning (с флагом -Wall), если вы описали инициализацию членов класса в другом порядке. И это еще одна причина в пользу использования настройки компилятора «считать предупреждения ошибками» (в gcc это флаг -Werror).

blog2k.ru

Каковы ваши три самые сильные и слабые стороны?

Достаточно распространенный вопрос, на который нужно подготовить действительно хороший ответ. Что касается сильных сторон, то обратите внимание на то, что компании нуждаются в следующих вещах: зарабатывать деньги, экономить деньги и экономить время. Что касается слабостей, то попытайтесь указывать не на черты вашего характера, а на определенные навыки. Например, вы можете упомянуть, что раньше вы не умели работать с PowerPoint, однако прочитали об этом книгу, много практиковались и сейчас даже можете обучать других работе с этой программой. Каждый раз, когда вы говорите о своей слабости, также называйте способ, которым вам удалось эту слабость победить. Также можно указать свою слабость, которую потом можно превратить в силу. Например, вы может сказать, что очень страстно относитесь к своей работе и полностью отдаетесь ей. Именно поэтому, если вы видите других людей, которые работают не так, это вам не нравится.

вопросы

Что не дает вам спать ночью?

Еще один способ спросить о ваших слабостях. Лучше всего сказать: за исключением нескольких кошмаров о предстоящих интервью, вы работаете очень усердно, поэтому у вас нет проблем со сном. Вы знаете, насколько важно планирование своего времени, и при помощи сна "перезагружаете батарейки".

ответ

Опишите ваш прогресс на предыдущей работе

Отличный вопрос, если компания ищет кандидата определенного типа. В ответе можно упомянуть личные и деловые качества. Упоминая предыдущую работу, говорите о ней позитивно. Скажите: атмосфера на предыдущей работе была отличной, вы много работали и видели хороший результат. Если у вас не было повышений, тогда упомяните ответственные задания, которые были вам предоставлены и которые вы выполнили на отлично. Также можно рассказать о некоторых трудных ситуациях, которые вы смогли преодолеть.

ответ

Если бы вы были цветом, то каким именно?

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

ответ

Как долго вы планируете работать в нашей компании?

Это отличный вопрос, который косвенно указывает, что вам хотят предложить место. Однако этот вопрос также может быть коварным. Вы можете красиво уйти от подобного ответа, перенаправив его обратно на работодателя. Скажите: вы хотите построить успешную и продолжительную карьеру в этой компании. Упомяните, что вы хорошо справляетесь с трудностями и ищете новые возможности для роста. После этого спросите работодателя, как долго он готов предлагать вам такие возможности.

ответ

Опишите, как вы работаете над серьезным проектом

Это прекрасная возможность продемонстрировать себя в качестве менеджера. Стратегическое планирование невозможно без учета ресурсов, которые вам нужны, а также конкретных дат и четких этапов. Это, несомненно, приведет к положительному результату.

Как вы справляетесь со стрессом?

Лучше всего скажите: вы избегаете стрессовых ситуаций благодаря правильному планированию своего времени. В сутках не так много времени, поэтому вы хотите его использовать максимально, ставя при этом конкретные и четкие цели. Вы регулярно делаете физические упражнения, правильно питаетесь и хорошо высыпаетесь. Благодаря этому вам удается эффективно бороться со стрессом.

ответ

Чтобы вы сделаете в первые 90 дней на работе?

Не зная деталей, лучше всего дать общий ответ. Упомяните, что вы будете выстраивать свои цели согласно политике компании, а также верите, что все они будут успешно достигнуты. Вы определяете свои цели согласно вашим приоритетам, учитывая при этом нужды компании на каждом конкретном этапе.

ответ

Что вам нравится и что вам не травится в вашей нынешней работе?

Здесь главное - не поддаться искушению и не сказать что-то негативное о вашей нынешней работе. Даже если вы считаете, что ваша компания похожа на комнату пыток, не говорите этого на интервью. Ваш работодатель ждет от вас позитивного комментария. Скажите, что вы довольны своей работой, что атмосфера там положительная, а ваш начальник очень вас поддерживает и выступает в качестве учителя. После этого скажите, что, например, компания, в которой вы сейчас работаете, небольшая, поэтому вы не видите для себя возможностей для роста. Если же ваша компания большая, тогда скажите, что вы ищете небольшую организацию, где вы сможете внести более значительный вклад.

ответ

Какая часть вашей работы является для вас самой важной?

Здесь важно не просто начать перечислять всякие задания, которые всплывают у вас в голове, а изложить общую ситуацию, выгодно представляя при этом ваши положительные черты характера. Скажите, что для вас важно поэтапное планирование вашего времени, а также четкое определение целей на каждом из этапов.

Что вы думаете о сверхурочной работе?

Здесь главное - не сказать, что вы не готовы к сверхурочной работе, поскольку у вас больной родственник, маленький ребенок или любые другие проблемы. Лучше всего скажите, что вы гордитесь своими умениями правильно планировать свое время и быстро и эффективно работать, однако вы понимаете, что иногда нужно поработать и сверхурочно.

ответ

Опишите ваши лидерские качества

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

Как вы развиваете ваши таланты?

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

Назовите ваше самое большое достижение

Спросите у вашего работодателя о том, что именно он подразумевает: личное или профессиональное достижение. Если он попросит назвать два варианта, то это просто отлично, если же попросит выбрать одно по степени важности, тогда обязательно поставьте профессиональное достижение выше. Не упоминайте, что самым большим достижением в ваше жизни является рождение вашего ребенка, даже если это действительно так (и должно быть таковым). Помните: вы здесь для того, чтобы показать свой профессионализм, поэтому выстраивайте ваши ответы в соответствии с этой целью.

Продайте мне эту ручку

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

У вас есть еще вопросы?

У вас всегда должны быть вопросы. Никогда не отвечайте, что их у вас нет и вам все понятно. Это ваш последний шанс оставить о себе хорошее впечатление. Придите на интервью подготовленным и возьмите с собою блокнот, в котором будет минимум пять вопросов, касающихся данной компании. Для этого поищите дополнительную информацию о ней и продемонстрируйте, что вы хорошо знакомы с особенностями ее работы. В качестве примера вы можете спросить о том, какой работодатель видит компанию через 5 лет, или же о том, какие навыки он считает необходимыми для этой работы.

fb.ru


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.