Контрольная работа: Актуальные вопросы в работе с С++
?>
Пример 5.10. Возвращение ссылки
При использовании синтаксиса ссылок в переменную $var нашего примера не копируется значение переменной $b возвращенной функцией $ref, а создается ссылка на эту переменную. То есть теперь переменные $var и $b идентичны и будут изменяться одновременно.
6. Что такое класс? В чем отличие класса от структуры? Приведите примеры структуры и класса
Для С++ классы 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 являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).
Переменные размерного типа непосредственно содержат данные, а переменные ссылочного типа содержат ссылку на область памяти, содержащую данные. При этом, память под ссылочные переменные всегда выделяется в куче, а память под размерные, обычно, в стеке. Как известно, в .NET для освобождения неиспользуемой памяти в куче используется сборщик мусора. Особенностью стека является то, что память в нем освобождается автоматически (без каких-либо накладных расходов). Таким образом, уничтожение ссылочных объектов путем сборки мусора менее эффективно, чем размерных.
Другой важный момент - это упаковка (boxing) и распаковка (unboxing). При упаковке размерного типа происходит выделение области памяти в куче и копирование значения размерного типа в эту область. Упакованный размерный тип обладает свойствами ссылочного. Распаковка - обратный процесс, в результате которого упакованный размерный тип копируется на стек. Благодаря упаковке любой размерный тип может интерпретироваться как ссылочный и, как следствие этого, любой размерный тип может использоваться вместо object. Важно понимать, что упаковка и распаковка требуют дополнительных затрат памяти и времени. Поэтому следует избегать этих операций в большом количестве.
Теперь вернемся к нашему вопросу. Отличие структуры от класса:
- Структура является размерным типом, а класс - ссылочным.
- Все структурные типы неявно наследуются от System.ValueType, они не бывают абстрактными и всегда неявно запечатаны (sealed)
- При присваивании переменных структурного типа, создается копия данных
- Объявления полей структуры не могут иметь инициализаторов
- Различная интерпретация this для структуры и класса
- Структура не может содержать конструктор без параметров
- Структура не может содержать деструктор
- Для ссылочных типов значение по умолчанию - null
- При конвертировании между ссылочным и размерным типами происходит упаковка и распаковка
Главное помнить и понимать главные:
1 - следствием этого является то, что экземпляр класса создается в куче, а структуры, обычно (но не всегда) на стеке
3 - это должно быть очевидно
4- является следствием 6, т.к. код инициализации полей неявно вставляется во все конструкторы
6 является следствием оптимизации использования структур по скорости
Особенности 8 для структур и 9 рассмотрим ниже более подробно, т.к. именно на них любят акцентировать внимание на собеседовании.
Рассмотримтакойпример:
1.public struct MyStruct
2.{
3. public int m1;
4. public string s1;
5.}