2. 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
3. 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.
4. 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
5. 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);
6. 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ță.
7. 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;
8. 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.
9. 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;
};
10. 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();
11. 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;
}
};
12. 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