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 . Указатели на такую память обозначаются символом ^ .
К составным native -типам данных относятся:
- native -структуры;
- native -классы.
Для доступа к таким типам данных используется неуправляемый указатель * ( unmanaged pointer ).
Более подробно работа неуправляемых указателей ( * ) описывается в темах:
- Указатели. Часть 2. Неуправляемые указатели. Операции над указателями. Указатель на тип void. Выделение памяти. Нулевой указатель. Операция взятия адреса &.
- Указатели. Часть 3. Неуправляемые указатели и массивы. Указатель на структуру. Указатель на класс
- Указатели. Часть 5. Выделение памяти для указателя. Массивы указателей на базовые типы, структуры, функции, классы
К управляемым составным типам данных (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 этапа:
- Выделение памяти для 20 указателей на тип int .
- Выделение памяти для каждого элемента типа 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 ) указателей ( ^ ) на класс из другого программного кода: