2. Содержание
Типы данных
Примитивные типы данных
Составные типы данных
Ссылочные типы
Типы значений
Перечислимые типы
интерфейсы
Новые свойства классов
Свойства
Делегаты
События
3. Типы данных
C++/CLI – язык, который позволяет создавать
как управляемый, так и неуправляемый код.
Управляемый код располагается в управляемой
куче.
Управляемые типы данных унаследованы от
типа Object.
4. Примитивные типы данных
Управляемый тип Соответствие
Boolean bool
Byte unsigned char
Char wchar_t
Double double
Int16 short
Int32 long, int
Int64 __int64, long long
SByte char
Single float
UInt16 unsigned short
UInt32 unsigned int, unsigned long
Uint64 unsigned __int64, unsigned long long
Void void
5. Составные типы данных:
ссылочные типы
Обладают семантикой ссылок
Переменные хранятся в
ссылочной куче
Обращение к переменным
осуществляется через
дескриптор
Дескриптор в процессе
выполнение программы
может меняться («уплотнение
кучи»)
Выделение памяти – при
помощи gcnew
Переменная, не ссылающаяся
на память в куче, равна nullptr
ref class Man{
String^ name;
Byte age;
public:
Man(): age(0)
{
name = gcnew String("");
}
Man(String^ n, Byte a): age(a)
{
name = n;
}
};
Man^ m = gcnew Man(“Henry“, 20);
6. Составные типы данных:
типы значений
value struct Point
{
Int32 x, y;
};
Point pt;
Простая структура
Память выделяется в стеке
программы
Вычисления более
эффективны, чем с
ссылочными типами
7. Составные типы данных:
перечислимые типы
Эквивалентен enum
из обычного С++
Унаследован от
Object
Есть свойство
ToString
enum class COLOR
{
BLACK = 0,
RED, GREEN,
BLUE, WHITE
};
COLOR c = COLOR::RED;
8. Составные типы данных:
интерфейсы
interface class Shape {
void Draw();
void Move(Int32, Int32);
};
value struct Point: Shape {
Int32 x, y;
virtual void Move(Int32 dx,
Int32 dy) {
x += dx;
y += dy;
}
virtual void Draw(){}
};
В С++/CLI нет множественного
наследования
Интерфейс – тип данных,
объявляющий методы, но не
имеющий полей и реализаций
методов
Интерфейс эквивалентен
абстрактным классам в С++
Управляемый класс может
быть унаследован от
множества интерфейсов
9. Новые свойства классов:
свойства
Свойства (properties)-
специальная языковая
конструкция,
предназначенная для
установки/получения
значения некоторого поля.
ref struct Value {
property int x;
};
//…
ref struct Value {
property int x {
void set(int v){ this->__x
= v; }
int get() const { return
this->__x; }
}
private:
int __x;
};
10. Новые свойства классов:
делегаты
delegate void Reshape();
ref struct Shape{
Shape(){}
void Draw(){}
};
ref struct Point{
property int x;
property int y;
Reshape^ reshape;
Point(){
reshape = gcnew Reshape(gcnew
Shape(), &Shape::Draw);
}
};
int main(){
Point^ p = gcnew Point();
p->reshape();
return 0;
}
делегирование – передача
управления объектом другому
объекту (или
функции/функциям)
Объявляется при помощи
ключевого слова delegate
Делегаты унаследованы от
System::MulticastDelegate
Делегат связывается со
списком функций
Добавление в список функций
– +=, удаление из списка
функций – -=.
Выполнение делегата –
Void Invoke();
11. Новые свойства классов:
события
События – один из видов
делегатов
объявляются при помощи
ключевого слова event
Функции, связываемые с
событием, называются
обработчиками события
System::EventHandler –
базовый тип событий
Базовый вид обработчика
событий –
Void OnEvent(Object^
sender, EventArgs^ args);
ref class Car{
Int32 speed;
public:
event EventHandler^
lowTemperature;
Car(Int32 initSpeed):
speed(initSpeed) {
lowTemperature += gcnew
EventHandler(this,
&Car::OnLowTemperature);
}
Void OnLowTemperature(Object^
sender, EventArgs^ args){
speed = 0;
}
};
12. Виртуальные функции
При переопределении
виртуальной функции
базового класса, после её
объявления указывается
модификатор override. В этом
случае функция
прописывается в таблице
виртуальных функций
В случае, если виртуальная
функция не участвует в
механизме полиморфизма,
она определяется
постфиксным модификатором
new