. C++. Указатели. Часть 6. Составные native и managed типы данных. Управляемые указатели (^) в среде CLR. Выделение памяти. Квалификаторы ref и value. Управляемые указатели (^) на структуры и классы
C++. Указатели. Часть 6. Составные native и managed типы данных. Управляемые указатели (^) в среде CLR. Выделение памяти. Квалификаторы ref и value. Управляемые указатели (^) на структуры и классы

C++. Указатели. Часть 6. Составные native и managed типы данных. Управляемые указатели (^) в среде CLR. Выделение памяти. Квалификаторы ref и value. Управляемые указатели (^) на структуры и классы

Указатели. Часть 6. Составные native и managed типы данных. Управляемые указатели ( ^ ) в среде CLR . Выделение памяти. Квалификаторы ref и value . Управляемые указатели ( ^ ) на структуры и классы

Содержание
  • 1. Какие особенности организации работы составных типов данных в средеCLR ( Common Language Runtime )?
  • 2. Какие особенности использования составных native типов данных?
  • 3. Какие особенности использования управляемых ( managed ) составных типов данных?
  • 4. Какие квалификаторы используются для объявления структур и классов в среде CLR ?
  • 5. Какое отличие между квалификаторами ref и value при объявлении структур или классов? Примеры доступа к ref -структурам и value -структурам с помощью указателя
  • 6. Какой доступ по умолчанию имеют поля и члены данных структуры и класса?
  • 7. Пример объявления и использования структуры с квалификатором ref
  • 8. Каким образом описываются managed -массивы в среде CLR ? Назначение ключевого слова array
  • 9. Пример объявления и использования массива managed-структур, которые объявлены с квалификатором ref , с помощью управляемого указателя ( ^ )
  • 10. Пример объявления и использования managed -массива на базовые типы ( int , double ) с помощью управляемого ( ^ ) указателя
  • 11. Пример объявления и использования массива указателей ( ^ ) на класс, которые объявленные как managed с использованием классификатора ref и ключевого слова array
  • Связанные темы

Поиск на других ресурсах:

1. Какие особенности организации работы составных типов данных в среде CLR ( Common Language Runtime )?

В языке C++ ( Visual C++ ) существует два вида составных типов данных:

  • native -типы данных. Указатели на такие типы данных обозначаются символом * ;
  • типы данных для работы в среде CLR ( Common Language Runtime ). Эти типы еще называются managed -типами данных или управляемыми типами данных. Такие типы данных размещаются в памяти, которая выделяется средой CLR . Объекты этих типов данных должны размещаться в динамической памяти, которая управляется средой CLR . Указатели на такую память обозначаются символом ^ .
2. Какие особенности использования составных native типов данных?

К составным native -типам данных относятся:

  • native -структуры;
  • native -классы.

Для доступа к таким типам данных используется неуправляемый указатель * ( unmanaged pointer ).

Более подробно работа неуправляемых указателей ( * ) описывается в темах:

  • Указатели. Часть 2. Неуправляемые указатели. Операции над указателями. Указатель на тип void. Выделение памяти. Нулевой указатель. Операция взятия адреса &.
  • Указатели. Часть 3. Неуправляемые указатели и массивы. Указатель на структуру. Указатель на класс
  • Указатели. Часть 5. Выделение памяти для указателя. Массивы указателей на базовые типы, структуры, функции, классы
3. Какие особенности использования управляемых ( managed ) составных типов данных?

К управляемым составным типам данных (managed) относятся:

  • managed -структуры;
  • managed -классы.

Такие структуры и классы предназначены для работы в среде CLR . Они размещаются в памяти, которая выделяется и управляется средой CLR . Если программист создает проект типа «CLR Console Application» или «Windows Forms Application» , то этот проект удовлетворяет требованиям среды CLR .

Объекты, которые управляются CLR средой, попадают в управляемую динамическую память. При описании указателя на managed -структуру или managed -класс используется символ ^ . Память для такого указателя выделяется утилитой gcnew .

4. Какие квалификаторы используются для объявления структур и классов в среде CLR ?

В среде CLR структуры и классы могут иметь два квалификатора:

  • квалификатор ref – означает, что структура или класс есть ссылочного типа;
  • квалификатор value – означает, что структура или класс есть типом значения.

В среде CLR можно также объявлять структуру или класс без квалификатора. Работа с такими структурами используется для совместимости с указателями на структуры более старых версий C/C++ .

5. Какое отличие между квалификаторами ref и value при объявлении структур или классов? Примеры доступа к ref -структурам и value -структурам с помощью указателя

Отличие между квалификаторами ref и value состоит в способе выделения памяти для указателя на структуру или класс.

С модификатором ref структура или класс размещается в управляемой ( managed ) куче и не может быть размещена в native -куче.

С модификатором value структура или класс может быть размещена и в управляемой ( managed ) куче и в native -куче.

Нижеследующие примеры демонстрируют отличие между структурами, которые описаны с квалификаторами ref и value . То же самое относится и к классам.

Пусть нужно использовать структуру, которая описывает пиксель на экране монитора.

Пример 1. Объявление структуры с квалификатором ref.

Тогда, использование структуры из другого программного кода может быть следующим:

Пример 2. Объявление структуры с квалификатором value .

6. Какой доступ по умолчанию имеют поля и члены данных структуры и класса?

При объявлении структуры, ее поля (члены данных) и методы имеют спецификатор доступа public . При объявлении класса, его члены данных и методы имеют спецификатор доступа private .

7. Пример объявления и использования структуры с квалификатором ref

Пусть дана структура, которая объявлена в модуле «MyRefStruct.h» . Структура описывает координаты точки на плоскости. Структура объявлена с квалификатором ref .

Пример использования структуры в программе с помощью управляемого ( managed ) указателя.

8. Каким образом описываются managed -массивы в среде CLR ? Назначение ключевого слова array

В C++ native -массивы объявляются обычным для языка способом.

Более детально о массивах в C++ описывается в следующих статьях:

Чтобы описать managed -массив используется ключевое слово array .

9. Пример объявления и использования массива managed -структур, которые объявлены с квалификатором ref , с помощью управляемого указателя ( ^ )

Пусть в модуле «MyRefStruct.h» объявлена структура MyPointRef , которая описывает точку на координатной плоскости

Работа с массивом из 10 managed -структур типа MyPointRef продемонстрирована ниже. Сначала нужно подключить файл структуры:

Выделение памяти для массива и заполнения полей значениями структуры из другого программного кода (например, обработчика события клика на кнопке):

Если объявить структуру MyPointRef с квалификатором value , то данный пример также будет работать.

10. Пример объявления и использования managed -массива на базовые типы ( int , double ) с помощью управляемого ( ^ ) указателя

В приведенном ниже примере объявляется массив из 20 целых чисел типа int . Для этого используется управляемый указатель ( ^ ).

Выделение памяти для массива происходит в 2 этапа:

  1. Выделение памяти для 20 указателей на тип int .
  2. Выделение памяти для каждого элемента типа int , на которые должны указывать указатели.

Для объявления массива используется ключевое слово array .

11. Пример объявления и использования массива указателей ( ^ ) на класс, которые объявленные как managed с использованием классификатора ref и ключевого слова array

В примере объявлен класс с именем MyClassRef , описывающий координаты точки на плоскости. Класс объявлен как managed (имеет квалификатор ref ). Класс содержит:

  • внутренние скрытые ( private ) члены данных x , y ;
  • конструктор класса MyClassRef() ;
  • методы GetX() и GetY() , возвращающие значение членов данных x , y ;
  • метод SetXY() , устанавливающий новые значения членов данных x , y .

Класс описан в двух модулях (файлах):

  • модуль «MyClassRef.h» – содержит объявление членов данных класса и его методов;
  • модуль «MyClassRef.cpp» – содержит реализацию методов класса.

Текст модуля «MyClassRef.h» :

Текст модуля «MyClassRef.cpp» :

Чтобы из другого программного кода использовать методы класса надо предварительно подключить модуль «MyClassRef.h» :

После этого можно использовать методы класса. Ниже продемонстрировано объявление и использование массива управляемых ( managed ) указателей ( ^ ) на класс из другого программного кода:

📎📎📎📎📎📎📎📎📎📎