Curs1visual Studio

13
Programare Windows I Visual C++ Curs 1 1 Microsoft Visual Studio Microsoft Visual Studio este un mediu de dezvoltare integrat (integrated development environment - IDE) de la Microsoft. Acesta poate fi folosit pentru a dezvolta aplicaţii consolă şi aplicații cu interfaţă grafică pentru toate platformele suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc). Istoricul versiunilor Denumire Versiune Versiunea .NET Framework Anul lansării Visual Studio 4.0 N/A 1995 Visual Studio 97 5.0 N/A 1997 Visual Studio 6.0 6.0 N/A 1998 Visual Studio .NET (2002) 7.0 1.0 2002 Visual Studio .NET 2003 7.1 1.1 2003 Visual Studio 2005 8.0 2.0 2005 Visual Studio 2008 9.0 3.5 2007 Visual Studio 2010 10.0 4.0 2010 Visual Studio 2012 11.0 4.5 2011 Anterior versiunii Visual Studio 4.0 a existat Visual Basic 3, Visual C++, Visual FoxPro și Source Safe ca și produse independente. Microsoft Visual Studio oferă editor, compilator/debugger și mediu de proiectare (designer) pentru mai multe limbaje de programare. Limbaje de programare incluse: Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web Developer, Team Foundation Server. Limbaje anterioare: Visual FoxPro (eliminat în 2007), Visual SourceSafe (întrerupt începând cu Visual Studio 2008), Microsoft Visual J++/ Microsoft Visual J # (întrerupt începând cu Visual Studio 2008), Visual InterDev (înlocuit cu Microsoft Visual Web Developer). Pe lângă limbajele amintite anterior, Microsoft Visual Studio oferă suport și pentru alte limbaje, cum ar fi M, Python, Ruby. De asemenea, sprijină XML/XSLT, HTML/XHTML, JavaScript și CSS.

description

IT

Transcript of Curs1visual Studio

Programare Windows I – Visual C++ Curs 1

1

Microsoft Visual Studio

Microsoft Visual Studio este un mediu de dezvoltare integrat (integrated

development environment - IDE) de la Microsoft. Acesta poate fi folosit pentru a

dezvolta aplicaţii consolă şi aplicații cu interfaţă grafică pentru toate platformele

suportate de Microsoft Windows (ex. .NET Framework, Windows Mobile etc).

Istoricul versiunilor

Denumire Versiune

Versiunea

.NET

Framework

Anul

lansării

Visual Studio 4.0 N/A 1995

Visual Studio 97 5.0 N/A 1997

Visual Studio 6.0 6.0 N/A 1998

Visual Studio .NET (2002) 7.0 1.0 2002

Visual Studio .NET 2003 7.1 1.1 2003

Visual Studio 2005 8.0 2.0 2005

Visual Studio 2008 9.0 3.5 2007

Visual Studio 2010 10.0 4.0 2010

Visual Studio 2012 11.0 4.5 2011

Anterior versiunii Visual Studio 4.0 a existat Visual Basic 3, Visual C++, Visual

FoxPro și Source Safe ca și produse independente.

Microsoft Visual Studio oferă editor, compilator/debugger și mediu de proiectare

(designer) pentru mai multe limbaje de programare. Limbaje de programare incluse:

Microsoft Visual C++, Microsoft Visual C#, Microsoft Visual Basic, Microsoft Visual Web

Developer, Team Foundation Server.

Limbaje anterioare: Visual FoxPro (eliminat în 2007), Visual SourceSafe

(întrerupt începând cu Visual Studio 2008), Microsoft Visual J++/ Microsoft Visual J #

(întrerupt începând cu Visual Studio 2008), Visual InterDev (înlocuit cu Microsoft

Visual Web Developer).

Pe lângă limbajele amintite anterior, Microsoft Visual Studio oferă suport și

pentru alte limbaje, cum ar fi M, Python, Ruby. De asemenea, sprijină XML/XSLT,

HTML/XHTML, JavaScript și CSS.

Programare Windows I – Visual C++ Curs 1

2

Visual studio este oferit în mai multe variante: Express, Professional, Premium,

Ultimate, Test Professional.

.NET Framework este o platformă/cadru (Framework) de dezvoltare software

unitară, înzestrată cu un set mare de clase, structuri, enumerări etc., organizate într-un set

de spaţii de nume (namespaces) bazate pe un limbaj comun.

.NET Framework este o componentă livrată împreună cu sistemul de operare

Windows.

În imaginea de mai jos este sumarizat istoricul versiunilor si arată versiunea

instalată de fiecare versiune de Windows.

(sursa: http://msdn.microsoft.com)

Tehnologia .NET pune laolaltă mai multe tehnologii (ASP, XML, OOP, SOAP,

WDSL, UDDI) şi limbaje de programare (ex.: C++, VB, C#) asigurând, totodată, atât

portabilitatea codului compilat între diferite calculatoare cu sistem Windows, cât şi

reutilizarea codului în programe, indiferent de limbajul de programare utilizat. Pentru a fi

integrate în platforma .NET, limbajele de programare sus amintite respectă un set de

caracteristici de bază Common Language Specification (CLS), astfel asigurându-se

interoperabilitatea între aplicaţii, indiferent de limbajul folosit pentru crearea acestora.

CLS-ul definește și un set de tipuri - Common Type System (CTS). Ca elemente de bază,

limbajele de programare au: clase, interfeţe, delegări, tipuri valoare şi referinţă, iar ca

mecanisme: moştenirea, polimorfismul şi tratarea excepţiilor. Limbajele au o platformă

comună de executare numită Common Language Runtime (CLR). Toate aceste limbaje

folosesc un ansamblul de biblioteci necesare în realizarea aplicaţiilor desktop sau Web,

numit Framework Class Library (FCL). În figura de mai jos este arhitectura pentru

.NET Framework.

Programare Windows I – Visual C++ Curs 1

3

Componenta .NET Framework este formată din compilatoare, biblioteci şi alte

executabile utile în rularea aplicaţiilor .NET. Fişierele corespunzătoare se află, în general,

în directorul C:\WINDOWS\Microsoft.NET\Framework\V2.0…. (corespunzător

versiunii instalate).

Compilarea programelor

Un program scris într-unul dintre limbajele .NET conform Common Language

Specification (CLS) este compilat în Microsoft Intermediate Language (MSIL sau

IL). Codul astfel obţinut are extensia ".exe", dar nu este direct executabil, ci respectă

formatul unic MSIL. CLR include o maşină virtuală asemănătoare cu o maşină Java, ce

execută instrucţiunile IL rezultate în urma compilării. Maşina foloseşte un compilator

special JIT (Just In Time). Compilatorul JIT analizează codul IL corespunzător apelului

unei metode şi produce codul maşină adecvat şi eficient. El recunoaşte secvenţele de cod

pentru care s-a obţinut deja codul maşină adecvat, permiţând reutilizarea acestuia fără

recompilare, ceea ce face ca, pe parcursul rulării, aplicaţiile .NET să fie din ce în ce mai

rapide. Faptul că programul IL produs de diferitele limbaje este foarte asemănător are ca

rezultat interoperabilitatea între aceste limbaje. Astfel, clasele şi obiectele create într-un

limbaj specific .NET pot fi utilizate cu succes în altul. Pe lângă cele de mai sus, CLR-ul

se ocupă și de gestionarea automată a memoriei (eliberarea automată a zonelor de

memorie asociate unor date devenite inutile).

Privitor la portabilitate, trebuie spus că .NET Framework are la bază standardul

Common Language Infrastructure, ceea ce face ca aplicaţiilor .NET să ruleze, în afară

de Windows, şi pe unele tipuri de Unix, Linux, Solaris, Mac OS X şi alte sisteme de

operare.

Dintre avantajele utilizării platformei .NET Framework putem enumera:

oferă instrumente pe care le putem folosi şi în alte programe;

Programare Windows I – Visual C++ Curs 1

4

oferă acces uşor la baze de date;

permite realizarea desenelor sau a altor elemente grafice.

spaţiul de nume System::Windows::Forms conţine instrumente (controale)

ce permit implementarea elementelor interfeţei grafice cu utilizatorul;

oferă clase care efectuează majoritatea sarcinilor uzuale cu care se

confruntă, reducând astfel timpul necesar dezvoltării aplicaţiilor.

Microsoft Visual C++

Microsoft Visual C++ (abreviat MSVC) este un produs IDE (Integrated

Development Environment) al Microsoft pentru C, C++ și C++/CLI. Oferă instrumente

pentru dezvoltarea și depanarea codului C++, cod scris în mod special pebtru Microsoft

Windows API (Aplication Programing Interface), DirectX API și Microsoft .NET

Framework.

Odată cu lansarea Microsoft Visual Studio 2012, Visual C++ a ajuns la versiunea

10.0, fiind oferit în varianta pentru 32 biți sau 64 biți.

Mai jos este prezentat istoricul versiunii pentru 32 biți (sursa: Wikipedia

http://en.wikipedia.org/wiki/Visual_C%2B%2B)

Visual C++ 1.0 (original name: Visual C++ 32-bit Edition) was the first version

for 32-bit development.[7]

Although released when 16-bit 1.5 was available, it did

not include support for OLE2 and ODBC

Visual C++ 2.0, which included MFC 3.0, was the first version to be 32-bit only.

Visual C++ 4.0, which included MFC 4.0, was designed for Windows 95 and

Windows NT.

Visual C++ 4.2 did not support Windows 3.x (Win32s) development.[10]

This was

the final version with a cross-platform edition for the Macintosh available and it

differed from the 2.x version in that it also allowed compilation for the PowerPC

instruction set.

Visual C++ 5.0, which included MFC 4.21, was a major upgrade from 4.2.[11]

Available in four editions:

o Learning[12]

o Professional[13]

o Enterprise[14]

o RISC[15]

Visual C++ 6.0 (commonly known as VC6), which included MFC 6.0, was

released in 1998.[16]

The release was somewhat controversial since it did not

include an expected update to MFC. Visual C++ 6.0 is still quite popular and

often used to maintain legacy projects. There are, however, issues with this

version under Windows XP, especially under the debugging mode (for example,

the values of static variables do not display). The debugging issues can be solved

with a patch called the "Visual C++ 6.0 Processor Pack".[17]

Programare Windows I – Visual C++ Curs 1

5

Visual C++ .NET 2002 (known also as Visual C++ 7.0), which included MFC

7.0, was released in 2002 with support for link time code generation and

debugging runtime checks, .NET 1.0, and Visual C# and Managed C++. The new

user interface used many of the hot keys and conventions of Visual Basic, which

accounted for some of its unpopularity among C++ developers.[citation needed]

Visual C++ .NET 2003 (known also as Visual C++ 7.1), which included MFC

7.1, was released in 2003 along with.NET 1.1 and was a major upgrade to Visual

C++ .NET 2002. It was considered a patch to Visual C++ .NET 2002.

Accordingly, the English language upgrade version of Visual Studio .NET 2003

shipped for minimal cost to owners of the English language version of Visual

Studio .NET 2002. This was the last version to support Windows 95 as a

target.[citation needed]

eMbedded Visual C++ in various versions was used to develop for some

versions of the Windows CE operating system. Initially it replaced a development

environment consisting of tools added onto Visual C++ 6.0. eMbedded Visual

C++ was replaced as a separate development environment by Microsoft Visual

Studio 2005.

Visual C++ 2005 (known also as Visual C++ 8.0), which included MFC 8.0, was

released in November 2005. This version supports .NET 2.0 and dropped

Managed C++ for C++/CLI. Managed C++ for CLI is still available via compiler

options though. It also introduced OpenMP. With Visual C++ 2005, Microsoft

also introduced Team Foundation Server. Visual C++ 8.0 has problems compiling

MFC AppWizard projects that were created using Visual Studio 6.0, so

maintenance of legacy projects can be continued with the original IDE if rewriting

was not feasible. Visual C++ 2005 is the last version to be able to target Windows

98, Windows Me and Windows NT 4.0. [18]

[19]

o SP1 version also available in Microsoft Windows SDK Update for

Windows Vista. Version number: 14.00.50727.762

Visual C++ 2008 (known also as Visual C++ 9.0) was released in November

2007. This version supports .NET 3.5. Managed C++ for CLI is still available via

compiler options. By default, all applications compiled against the Visual C++

2008 Runtimes (static and dynamic linking) will only work under Windows 2000

and later. [20]

[21]

A feature pack released for VC9, later included into SP1, added

support for C++ TR1 library extensions.

o SP1 version also available in Microsoft Windows SDK for Windows 7.

Version number: 15.00.30729.01

Visual C++ 2010 (known also as Visual C++ 10.0) was released on April 12,

2010, and it is currently the latest stable release. It uses a SQL Server Compact

database to store information about the source code, including IntelliSense

information, for better IntelliSense and code-completion support.[22]

This version

adds a modern C++ parallel computing library called the Parallel Patterns Library,

partial support for C++0x, significantly improved IntelliSense, and performance

improvements to both the compiler and generated code.[23]

Visual C++ 2012 (known also as Visual C++ 11.0) was released on April 15,

2012, and it is currently the latest stable release.

Programare Windows I – Visual C++ Curs 1

6

Observații:

Microsoft Foundation Class Library (de asemenea, Microsoft Foundation

Classes sau MFC) este o bibliotecă aparținând Microsoft, care încapsulează porțiuni din

Windows API în clase de C++, formând o fundație pentru aplicațiile care rulează sub

sistemul de operare Microsoft Windows. Clasele sunt definite pentru mai multe obiecte

handle, unitățile de bază ale sistemului de operare, care definesc și obiecte grafice.

Windows API (Application Programming Interface) este o interfață destinată

programării aplicațiilor pentru sistemul de operare.

C++/CLI (Common Language Infrastructure) reprezintă specificaţiile Microsoft

pentru revizuirea limbajului Managed C++ în vederea simplificării sintaxei acestuia.

C++/CLI este disponibil numai începând cu Visual Studio (inclusiv în Express Editions).

Tipuri fundamentale de date în C++/CLI

Tip Descriere Domeniu de valori

bool Poate conţine valorile

true şi false .

True false

char Poate conţine valori

ASCII

-128 la +127.

short Stochează numere

întregi mici

-32.768 la +32.767

int Stochează numere

întregi

-2,147,483,648 la 2,147,483,647.

long Stochează numere

întregi ca şi int,

excepţie făcând

faptul că pe unele

compilatoare este sde

două ori mai mare

In Microsoft Visual C++, long are

aceeaşi mărime ca şi int.

__int8 Stochează numere

întregi (specific

Microsoft)

__int16 Stochează numere

întregi (specific

Microsoft)

__int32 Stochează numere

întregi (specific

Microsoft)

__int64 Stochează numere

întregi (specific

Microsoft)

-9,223,372,036,854,775,808 la

9,223,372,036,854,775,807.

Programare Windows I – Visual C++ Curs 1

7

Tip Descriere Domeniu de valori

float Stochează numere în

formă zecimală

In Visual C++, float stochează până la

şapte zecimale.

double La fel ca float, dar

precizia este mai

mare

double poate stoca până la 15 zecimale

wchar_t Tip extins pentru

caractere (wide

character sau

multibyte character)

C++/CLI are definite două tipuri întregi suplimentare:

Tip Dimensiune Domeniu de valori

long long 8 De la -9,223,372,036,854,775,808 până la

9,223,372,036,854,775,807

unsigned long long 8 De la 0 până la 18,446,744,073,709,551,615

Observaţie:

Pentru variabile de tip long long trebuie adăugat la final LL sau ll respectiv (ULL

sau ull)

long long big = 123456789LL;

unsigned long long imens = 999999999999999ULL;

Un tip fundamental într-un program C++/CLI este un tip value class. Fiecare tip

fundamental ISO/ANSI are un corespondent value class definit în spaţiul de nume

System.

Tip fundamental Dimensiune CLI Value Class

Bool 1 System::Boolean

Char 1 System::SByte

Signed char 1 System::SByte

Unsigned char 1 System::SByte

Short 2 System::Int16

unsigned short 2 System::UInt16

Int 4 System::Int32

unsigned int 4 System::UInt32

Programare Windows I – Visual C++ Curs 1

8

Long 4 System::Int32

unsigned long 4 System::UInt32

long long 8 System::Int64

unsigned long long 8 System::UInt64

Float 4 System::Single

Double 8 System::Double

long double 8 System::Double

wchar_t 2 System::Char

Un tip value class asociat unui tip fundamental are adăugate capabilităţi suplimentare.

Între tipul fundamental şi tipul value class asociat conversia poate fi făcută automat de

compilator.

Pe lângă tipurile value class asociate tipurilor standard mai există multe alte tipuri

de date, cum ar fi de exemplu tipul String ( care este utilizat pentru reprezentarea şirurilor

de caractere) şi tipul System::Decimal utilizat pentru numerele pentru care dorim să

stocăm până la 28 de zecimale.

Gestionarea automată a memoriei

Prin intermediul operatorilor new şi delete, în C++, programatorul gestionează

manual memoria ceea ce conferă avantaje dar şi dezavantaje.

Avantaje:

o permite un control foarte precis asupra momentului în care este distrus un obiect,

astfel folosindu-se memoria exact atât cât este nevoie;

o permite folosirea destructorilor, astfel obiectele fiind întotdeauna şterse

corespunzător.

Dezavantaje:

o riscul de a apela prea târziu (sau deloc) operatorul delete. Omiterea apelării

operatorului delete nu este în general fatală pentru program, dar conduce la

ocuparea memoriei mai mult decât este necesar (memory leakage). Memory leak

este o eroare de programare în care programatorul a alocat memorie pe heap

utilizând funcţiile din libraria standard C (malloc, calloc, realloc) sau operatorul

C++ new, dar nu a mai dezalocat memoria alocata . Acest fapt reprezintă o

problemă deoarece consumul de memorie al aplicaţiei poate creşte în mod

necontrolat. Problema devine critică mai ales în cazul aplicatiilor care trebuie sa

ruleze un timp îndelungat (de exemplu un server de baza de date, sau un server

web, un filesystem ... etc).

o riscul de a apela prea devreme operatorul delete –este o problemă mult mai gravă.

Programare Windows I – Visual C++ Curs 1

9

Exemplu:

//cream un obiect Punct ^P=gcnew Punct(); //il transmitem unei funcţii oFunctie(P); //folosim obiectul P->daX();//!!!!!!obiectul a fost şters în funcţie. EROARE!!!!! ... void oFunctie(Punct ^pct){ //foloseşte obiectul pct->daX(); //s-a terminat de folosit obiectul??? delete pct; }

Ca şi Sun Microsystems în cazul limbajului Java, Microsoft a decis că

dezavantajele gestionării manuale a alocărilor făcute depăşesc avantajele oferite, de aceea

s-a trecut la gestionarea automată a memoriei.

Se pot crea în continuare obiecte în mod dinamic, dar ştergerea obiectelor intră în

responsabilitatea sistemului, nu a programatorului. Sistemul urmăreşte referirile la

obiecte şi atunci când un obiect nu mai este referit, devine un candidat pentru “colectarea

gunoiului”.

Consecinţe ale acestei abordări:

1. obiectele sunt create întotdeauna folosind operatorul gcnew;

2. accesul la obiecte trebuie să se facă printr-o referiţă, care în C++ este pointerul;

3. nu se poate şti când se face colectarea gunoiului pentru un obiect.

Observaţie: Se poate folosi în continuare operatorul delete pentru distrugerea manuală a

unui obiect.

Accesul la tipurile pentru referinţe se face prin pointeri, ceea ce afectează dimensiunea şi

viteza aplicaţiei compilate. Din aceste motive se acceptă şi tipurile pentru valori.

Obiectele de tip valoare sunt create în stiva programului. În acest caz, variabila conţine

chiar obiectul, nu un pointer către obiect. Pentru manipularea obiectului nu este necesară

dereferirea, ceea ce îmbunătăţeşte performanţele. Pentru declararea unei clase de tip

valoare se foloseşte cuvântul rezervat value iar pentru declararea unei clase pentru

referinţe se foloseşte cuvântul rezervat ref. Clasele tip valoare nu suportă constructori

sau destructori.

După cum a fost prezentat anterior, CLR-ul este acela care se ocupă de management-ul

memoriei, al firelor de execuție precum și a altor servicii sistem. În ceea ce priveşte

securitatea, orice componentă managed are diferite grade de securitate în functie de

anumiti factori printre care este inclusă şi originea lor. Codul rulat de CLR se numeşte

cod gestionat, codul executat în afara controlului CLR numindu-se cod negestionat.

Alocarea dinamică a memoriei funcţionează diferit cu CLR.

Programare Windows I – Visual C++ Curs 1

10

o CLR-ul întreţine propria memorie heap, independentă de memoria heap C++

nativă.

o CLR-ul eliberează automat memoria alocată în memoria heap gestionată de CLR

când aceasta nu mai este utilizată, nemaifiind necesară utilizarea operatorului

delete într-un program scris pentru CLR.

o CLR-ul urmăreşte ca memoria să fie compactă, pentru evitarea fragmentărilor

(din când în când). Astfel erori de tip memory leaks şi fragmentări ale memoriei

sunt evitate.

Managementul şi curăţarea memoriei este descrisă ca „garbage collection”.

Gunoiul este reprezentat de variabilele şi obiectele şterse iar memoria heap gestionată de

CLR se numeşte garbage collection heap. Pentru alocarea memoriei în memoria heap

gestionată de CLR se foloseşte gcnew în loc de new, prefixul gc arătând că alocarea se

face în garbage collection heap şi nu în memoria heap nativă. Colectorul de gunoi CLR

este capabil să şteargă obiecte şi să elibereze memorie când acestea nu mai sunt necesare.

Colectorul de gunoi ştie când un obiect din heap nu mai este utilizat deoarece urmăreşte

toate obiectele din heap şi când nu mai există variabile spre o anumită zonă de memorie,

aceasta este eliberată. Atunci când obiectul iese din domeniul de valabilitate, memoria

alocată este recuperată de mecanismul de colectare a gunoiului, fără să fie necesar nici un

apel explicit al unei funcţii de ştergere. Aceasta este o variabilă de tip referinţă, deoarece

variabila nu conţine obiectul, ci un pointer către zona de memorie în care se află obiectul.

În acest caz memoria se alocă din zona heap gestionată, care poate forţa un proces de

colectare a gunoiului.

Important: Adresa datelor stocate în heap se poate modifica (se realizează

compactificarea acesteia de către colectorul de gunoi), prin urmare nu se pot utiliza

pointerii nativi C++ (adresa unui obiect gestionat se poate modifica).

Cele de mai sus arată că este necesară o cale de accesare a obiectelor din heap ce

să permită ca adresa să poată fi modificată când colectorul de gunoi relocă elementele din

heap. Acest lucru poate fi realizat cu tracking handle ( sau mai simplu handle) care este

un echivalent al pointerilor nativi C++ şi cu tracking reference care este un echivalent al

referinţelor native din C++.

Un tracking handle este similar unui pointer nativ C++ dar există şi câteva

diferenţe semnificative:

o un tracking handle nu conţine o adresă, aceasta fiind actualizată în mod automat

de colectorul de gunoi dacă obiectul este mutat în urma procesului de

compactificare a memoriei heap;

o nu se pot efectua operaţii aritmetice cu adresele pointerilor tracking aşa cum se

poate în cazul pointerilor nativi;

o toate obiectele create în heap-ul CLR trebuie să fie referenţiate de un pointer

handle.

Programare Windows I – Visual C++ Curs 1

11

Memoria pentru clasele valoare este alocată implicit în stivă stack, dar se poate

stoca un asemenea obiect şi în heap utilizând operatorul gcnew.

Sintaxa pentru declararea unui Tracking Handles este:

numeTip^ numeOb;

Exemplu:

String^ cuvant;

Când se declară un handle acesta este iniţializat automat cu nullptr. Pentru a anula

explicit un handle se foloseşte cuvântul rezervat nullptr, ca în exemplul de mai jos:

cuvant = nullptr;

Important: Nu se poate utiliza 0 pentru a anula un pointer handle ca în cazul

pointerilor nativi. Dacă se iniţializează un pointer handle cu 0 atunci se converteşte

valoarea 0 la tipul obiectului referenţiat şi adresa noului obiect este memorată în pointerul

handle.

Similar pointerilor nativi, un pointer handle poate fi iniţializat în momentul

declarării.

Exemplu:

String^ mesaj = "Exemplu de initializare";

Această linie de cod crează în heap un obiect String ce conţine mesajul din

membrul drept; adresa noului obiect este conţinută de mesaj.

Se pot crea pointeri handle şi către tipuri valoare:

Exemplu:

int^ valoare = 13;

Se crează pointerul handle valoare de tip int^ şi valoare pointată în heap este 13.

Pentru deferenţiere se foloseşte tot operatorul *, similar pointerilor nativi.

Exemplu:

int rezultat = 2*(*valoare)+10;

Observaţie: Când un pointer handle apare în membrul drept al unei atribuiri nu

este necesară deferenţierea explicită pentru reţinerea valorii atribuite.

Programare Windows I – Visual C++ Curs 1

12

Exemplu:

int^ rez = 0;//se crează pointerul handle rez care pointează către valoarea 0 rez = 2*(*valoare)+10;//în membrul drept având o valoare, compilatorul determină automat că trebuie să deferenţieze rez.

Bineînţeles, se poate scrie:

*rez = 2*(*valoare)+10;

Important.: Pentru ultima instrucţiune trebuie ca rez să fi fost definit şi nu doar declarat.

Un handle null nu poate fi deferenţiat.

Exemplu:

int^ rezultat; // Declarare fără definire *rezultat =2*(*valoare)+10; // Error message - unhandled exception

Exemplu ( C++/CLI):

// Exemplu.cpp : main project file. #include "stdafx.h" using namespace System; class A{ public: ~A(){Console::WriteLine("Am distrus un obiect al clasei A");} }; value class B{ //clasele tip valoare nu suporta constructori sau destructori }; ref class C{ public: ~C(){Console::WriteLine("Am distrus un obiect al clasei C");} }; void functieTest(){ A *a1=new A(),a2; B b; C ^c=gcnew C(); } int main(){ functieTest(); Console::WriteLine("Sfarsit aplicatie"); return 0; }

Programare Windows I – Visual C++ Curs 1

13

Am distrus un obiect al clasei A

Sfarsit aplicatie

Am distrus un obiect al clasei C

Press any key to continue

Se observă ca numai un obiect al clase A a fost distrus (a2).