c++/cli: tipuri de date
DESCRIPTION
Tipuri de date gestionabile în C++/CLI și proprietățile noi ăn descrierea claselorTRANSCRIPT
C++/CLI: TIPURI DE DATE
Mihail Croitor
Cuprins
Tipuri de date Tipuri de date primitive Tipuri de date compuse
Tip-referința Tip-valoare Tip enumerabil Interfețe
Proprietăți noi a claselor Proprietăți Delegați Evenimente
Funcții virtuale
Tipuri de date
C++/CLI este un limbaj care permite crearea codului gestionabil și negestionabil.
Tipurile gestionabile se plasează în memoria gestionabilă.
Fiecare tip gestionabil este moștenit de la clasa Object.
Există tipuri de date gestionabile primitive(sau simple) si compuse.
Tipuri de date primitive
Tip gestionabil echivalentul
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
Tipuri de date compuse:Tip referință
are semantica referințelor se păstrează in memoria tipurilor
de referință (reference heap) Acces la valori variabilelor se
realizează prin descriptor (^) Descriptorul poate schimba
valoarea sa în timpul executării aplicației («compactare memoriei tipurilor de referință»)
Memoria se alocă cu ajutorul operatorului gcnew
Dacă variabilă nu este legată cu memoria tipurilor de referință, atunci ea primește valoare 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);
Tipuri de date compuse:Tip valoare
value struct Point
{
Int32 x, y;
};
Point pt;
Sunt structuri simple Memoria pentru acest tip se
alocă în stiva programului. Efectuarea operațiilor cu
tipuri valoare sunt mai efective decât cu cele de tip referință.
Tipuri de date compuse:tip numărabil
Este echivalent tipului enum din С++ standard
Este moștenit de la Object
Are proprietate ToString
enum class COLOR
{
BLACK = 0,
RED, GREEN,
BLUE, WHITE
};
COLOR c = COLOR::RED;
Tipuri de date compuse:interfețe
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(){}
};
În C++/CLI nu există moștenire multiplă
Interfața - tip de date ce declară metode, dar nu au câmpuri și realizări de metode
Interfața este un tip echivalent claselor abstracte din C++
Clasa gestionabilă poate fi moștenită de la mai multe interfețe.
Proprietăți noi a claselor:proprietăți
Proprietăți(properties) este o construcție specială a limbajului destinată pentru setarea/extragerea valorii unui câmp.
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;
};
Proprietăți noi a claselor:delegare
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;}
Delegare este transmiterea dreptului de a acționa altui obiect sau funcției
Se declară cu ajutorul cuvântului cheie delegate
Delegate sunt moștenite de la clasa System::MulticastDelegate
Delegat poate fi legat cu o lista de funcții
Adăugarea funcțiilor în lista se face prin +=, eliminarea funcției din lista – -=.
Executarea delegatului – Void Invoke();
Proprietăți noi a claselor:evenimente
Evenimentele se reprezintă prin delegații
se definesc cu ajutorul cuvântului-cheie event
Funcții legate cu eveniment se numesc prelucrători evenimentului
Tip de baza a evenimentului este System::EventHandler
Reprezentare obișnuită prelucrătorului evenimentului este 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;
}
};
Funcții virtuale
Dacă funcția virtuală redefinește funcția clasului de bază, atunci după declararea funcției se adaugă modificatorul override. În acest caz funcția se înregistrează în tabelul funcțiilor virtuale
În caz dacă funcția virtuală nu participă în mecanismul polimorfismului, după declararea funcției se adaugă modificatorul new
Întrebări?
Mulțumesc pentru atenție!