Sunteți pe pagina 1din 23

2012/2013 - Suceava

LIMBAJUL C++
[ Cel mai simplu
program C++
]

Structura celui mai simplu program C++


in Visual C++ 6.0
C++ Builder
Code::Blocks
Directive
Dev-C++
preprocesor
gcc
// Program: Informatii despre
// Author(s): Remus PRODAN
// Date: 1/24/2008
Comentarii
#include <iostream>
#include <string>
Specidica domeniul
using namespace std;
de acces a lui cout.
int main( void )
{
Se afla in std
cout << "Hello world!" << endl;
return 0;
}

Functia
main() indicand
inceputul
programului
[ class::objects::methods ]

Inserarea in
fluxul de iesire
Sfarsitul executiei
main() ce corespunde
cu sfarsitul programului

2012/2013 - Suceava

Structura celui mai simplu program C++


in Borland C++ 3.1

Directive
preprocesor
// Program: Informatii despre
// Author(s): Remus PRODAN
// Date: 1/24/2008
Comentarii
#include <iostream.h>
#include <string.h>

LIMBAJUL C++
[ Cel mai simplu
program C++
]

int main( void )


{
cout << "Hello world!" << endl;
return 0;
}

Functia
main() indicand
inceputul
programului
[ class::objects::methods ]

Inserarea in
fluxul de iesire
Sfarsitul executiei
main() ce corespunde
cu sfarsitul programului

2012/2013 - Suceava

Stream-uri in C++
Stream-urile au in principal rolul de a
abstractiza operatiile de intrare- iesire.
Ofera metode de scriere si citire a datelor
independente de dispozitivul I/O si chiar
independente de platforma.
Stream-urile incapsuleaza (ascund) problemele
specifice dispozitivului cu care se lucreaza,
sub libraria standard iostream.

LIMBAJUL C++
[ Cel mai simplu
program C++
]

[ class::objects::methods ]

Alt avantaj al folosirii stream-urilor se datoreaza


implementarii librariei iostream, care
utilizeaza un sistem de buffer-e.

Stream-uri in C++

2012/2013 - Suceava

In C++ stream-urile au fost implementate


utilizand clase, dupa cum urmeaza:

clasa streambuf gestioneaza buffer-ele.

clasa ios este clasa de baza pentru clasele


de stream-uri de intrare si de iesire.

clasa ios are ca variabila membru un


obiect de tip streambuf.

clasele istream si ostream sunt derivate


din ios.

clasa iostream este derivata din


clasele istream si ostream si ofera metode
pentru lucrul cu terminalul.

clasa fstream ofera metode pentru operatii


cu fisiere.

LIMBAJUL C++
[ Cel mai simplu
program C++
]

[ class::objects::methods ]

2012/2013 - Suceava

Obiecte standard
Cand un program C++, ce
include iostream.h, este lansat in executie,
sunt create si initializate automat patru
obiecte:

LIMBAJUL C++
[
]

Stream-uri in C++

[ class::objects::methods ]

cin gestioneaza intrarea de la intrarea


standard (tastatura).

cout gestioneaza iesirea catre iesirea


standard (ecranul).

cerr gestioneaza iesirea catre dispozitivul


standard de eroare (ecranul), neutilizand
buffer-e.

clog gestioneaza iesirea catre dispozitivul


standard de eroare (ecranul), utilizand
buffer-e.

2012/2013 - Suceava

Redirectari
Dispozitivele standard de intrare, iesire si eroare
pot fi redirectate catre alte dispozitive.
Erorile sunt de obicei redirectate catre fisiere,
iar intrarea si iesirea pot fi conduse ("piped")
catre fisiere utilizand comenzi ale sistemului
de operare (utilizarea iesirii unui program
ca intrare pentru altul).

LIMBAJUL C++
[
]

Stream-uri in C++

Sintaxa pentru operatii de iesire, cout:


cout << InformatieDeTrimisLaIesire;
respectiv pentru intrare, cin:
cin >> NumeVariabila;
De fapt, cin si cout sunt obiecte definite global,
care au supraincarcat
operatorul >> respectiv operatorul << de
mai multe ori, pentru fiecare tip de
parametru in parte (int, char *, etc.).

[ class::objects::methods ]

Exemplu
2012/2013 - Suceava

#include <iostream.h>
void main( void )
{
int variabila;
cout << " Valoarea = ";
cin >> variabila;
cout << "\nValoarea= " << variabila << endl;
}

LIMBAJUL C++
[
]

Stream-uri in C++

Acest scurt program citeste de la intrarea standard o valoare


intreaga, pe care o trimite apoi catre iesirea standard.
Se observa posibilitatea de a utiliza simbolurile '\n', '\t', s.a.m.d
(ca la printf, scanf, etc.).
Utilizarea simbolului endl va forta golirea zonei tampon, adica
trimiterea datelor imediat catre iesire.
Atat operatorul >> cat si << returneaza o referinta catre un
obiect al clasei istream.

[ class::objects::methods ]

Deoarece cin este si el un obiect istream, valoarea returnata


de o operatie de citire/scriere din/in stream poate fi
utilizata ca intrare/iesire pentru urmatoarea operatie de
acelasi fel. Cazul este asemantor si pentru cout.

CLASE
2012/2013 - Suceava

Clasa reprezint un tip abstract de date, ce


ncapsuleaz att :
1. elementele de date (datele membre)
pentru care s-a adoptat un anumit
mod de reprezentare, ct i
2. operaiile asupra datelor (funciile
membre, metode).

LIMBAJUL C++

n limbajul C++, structurile i uniunile reprezint


cazuri particulare ale claselor, putnd
avea:

[ Programare Orientata
pe Obiecte ]

1. nu numai date membre ( cmpuri de


date ),
2. dar i funcii membre.

[ class::objects::methods ]

Observatie
Singura diferen ntre structuri i uniuni
const n faptul c la uniuni, pentru
memorarea valorilor datelor membre
se folosete aceeai zon de memorie.
.

CLASE
2012/2013 - Suceava

Deosebirea esenial ntre structuri i uniuni pe de o parte - i clase - pe cealat parte const n modul de acces la membrii:
la structuri i uniuni membrii (datele i
metodele) sunt implicit publici,

iar la clase - implicit privai (membrii


sunt ncapsulai).

Observatie

[ Programare Orientata
pe Obiecte ]

Lipsa unor modaliti de protecie a datelor,


face ca tipurile de date introduse prin
structuri sau uniuni s nu poat fi strict
controlate n ceea ce privete operaiile
executate asupra lor.

[ class::objects::methods ]

n cazul claselor, modul de acces la membrii


tipului de date (n scopul protejrii acestora)
poate fi schimbat prin utilizarea
modificatorilor de control ai accesului:
public,
private,
protected.

LIMBAJUL C++

2012/2013 - Suceava
STRUCTURA
Cuvnt cheie

Comparatie
class - struct

struct

class

Declarare

struct A{};

class B {};

variabile membre

Struct A a, s[10];
A a, s[10];

class B b, s[20];
B b, s[20];

In Limbajul C:
structura poate contine doar date
membre

LIMBAJUL C++
[

CLASA

notiunea de clasa nu exista

In Limbajul C++:
structura poate contine pe langa date
membre si functii
implicit, specificatorul de acces la
membri este public

[ class::objects::methods ]

la o clasa, acelasi specificator implicit,


este private

2012/2013 - Suceava

Exemplu
struct MyBook
{
char title[64];

// Public implicit

void show_book( void )


{
puts( title );
};
void set_price( float amount)
{
price = amount;
}

LIMBAJUL C++
[

Comparatie
class - struct

void set_title(char *name)


{
strcpy(title, name);
}

private:
float price;
};

[ class::objects::methods ]

Sintaxa generala

2012/2013 - Suceava

class <ID_clasa> [ : [specif_acces]


<ID_cls_baza1>[] ]
{
<lista_membrii>
- [ <modificator_acces> ]
[ <date> / <metode> ]
- [ <modificator_acces> ]
[ <date> / <metode> ]
} [ <lista_obiecte> ] ;

LIMBAJUL C++
[

Declararea
claselor

Exemplu

[ class::objects::methods ]

class deriv3 : public deriv1, private deriv2


{
char nume[20];
//
private:
int sum;
//
public:
void put( int x );
//
} ob1, *pOb, sirOb[100] ;

Sintaxa generala

2012/2013 - Suceava

n declaraia de mai sus avem urmtoarele semnificaii:


<ID_clasa> = un identificator (numele clasei similar cu
structurile)
<ID_cls_baza> = numele clasei de baz din care deriv clasa
(poate interveni o list de clase
<Specif_acces> = indic tipul motenirii si poate fi:
q motenire public ( public )
q motenire privat ( private, protected )

LIMBAJUL C++
[

Declararea
claselor

care la rndul lor pot fi :


q motenire simpl deriv dintr-o singur clas
q motenire multipl deriv din mai multe clase
<lista_membrii> = lista tuturor membrilor clasei , formata din:
q date membre
q funcii membre
< lista_obiecte> = lista tuturor variabilelor de tipul clasei
respective. Aceste variabile sunt denumite
OBIECTE ( INSTANTE ).

[ class::objects::methods ]

2012/2013 - Suceava

Obiecte
Obiectele pot fi definite impreuna cu clasa sau separat de
declaratia clasei:
[ class ] <ID_clasa>

<lista_obiecte>;

Exemplu
deriv3

ob1, *pob, sirOb[ 20 ];

unde:
ob1 este un obiect
pob un pointer la clasa / adresa de obiect
sirOb[ ] un sir de obiecte

LIMBAJUL C++
[

Declararea
claselor

Modificatori de control acces


Definim trei zone de acces n cadrul clasei, prin intermediul
modificatorilor de control acces:
q public,
qprotected,

[ class::objects::methods ]

qprivate

Obiecte

2012/2013 - Suceava

q Zonele sunt definite ntre dou cuvinte cheie sau ntre un


cuvnt cheie i specificatorul acces.
q Pentru compilatorul de C++ i structurile sunt interpretate
ca avnd zone de acces doar c pentru o structur, unde
nu e specificat zona, este considerat implicit ca fiind
public, pe cnd la clase se consider implicit private.
q Datele sau funciile situate ntr-o zon public a unei clase
pot fi accesate din exteriorul unei clase (din exteriorul clasei i
nu a obiectelor), pe cand zona private i cea protected este
accesat doar din interiorul clasei.

LIMBAJUL C++
[

Declararea
claselor

[ class::objects::methods ]

q Dou obiecte aparinnd aceleiai clase pot s-i


acceseze datele private sau protected, n schimb dou
obiecte aparinnd la clase diferite nu pot s-i utilizeze
dect zona public sau cea de interfa.

Exemplu

2012/2013 - Suceava

class masina
{
// dat membru la care accesul este, implicit, private
char *culoare;
// dat membru la care accesul este, implicit,
int capacit_cil;

private

public:
// metod cu acces public, care permite introducerea
// datelor intr-o instan a clasei
void citire_date( );
//metod cu acces public
int ret_capacit( );
};

LIMBAJUL C++
[

Declararea
claselor

Membrii culoare i capacitate_cil (accesul private) pot fi accesai doar prin


intermediul metodelor clasei.

class persoana
{
char *nume;

//dat membru privat

public:
void citire_inf_pers() ;//metod public

private:

[ class::objects::methods ]

int varsta;
};

//dat membru privat

OPERATORI DE ACCES LA MEMBRU

2012/2013 - Suceava

Operatorii de acces la membrii clasei sunt aceea i doi


operatori de la structuri :

Exemplu

LIMBAJUL C++
[

Declararea
claselor

class TestA
{
int x;
public :
float y;
int GetData(void);
void PutData(int xx);
private :
void Temp(void);
protected :
char nume [20];
} xx, a[10];

TestA ob1, 1ist[10], *pOb;


int var;
var = ob1.x ; // greit -accesarea unui membru privat
var = ob1.y ; // corect
pOb = &list[0]; // pOb = list;
pOb->PutData( (int)ob1.y ) ;
ob1.PutData( var );

[ class::objects::methods ]

Observatie
Datele private nu sunt accesibile din exteriorul clasei, n schimb
funciile public ale unei clase pot returna valori private.

OPERATORUL DE REZOLUIE ::
Implementarea tipului dreptunghi cu ajutorul unei clase

2012/2013 - Suceava

#include <iostream.h>
class dreptunghi
{
double Lung, lat;
public:
void seteaza_dimen(double, double );
double arata_Lung() {return Lung;}
double arata_Lat() {return lat;}
double calcul_arie(){return Lung*lat;}
};

LIMBAJUL C++
[

Declararea
claselor

void dreptunghi::seteaza_dimen( double L, double l )


{
Lung=L; lat=l;
}

void main( void )


{
dreptunghi a;
double l1, l2;
cout<<"Lungime="; cin>>l1;cout<<"Latime="; cin>>l2;
a.seteaza_dimen( l1, l2); cout<<Dim. drept. sunt:";
cout<<a.arata_Lung()<<" si"<<a.arata_Lat()<<'\n';
cout<<"Aria drept.:"<< a.calcul_arie() <<'\n';
cout<<"Dimens :"<<sizeof( a )<<'\n';

[ class::objects::methods ]

Observatii
2012/2013 - Suceava

n exemplul anterior se definete tipul de date


dreptunghi cu ajutorul unei clase.
Nivelul de acees implicit la membrii clasei este
private.
Dac pentru metode nu s-ar fi folosit modificatorul
de acces public, metodele nu ar fi putut fi folosite n
funcia main.
Membrii clasei dreptunghi
- Datele membru se aloc distinct pentru fiecare
instan (atribute ale instanei) a clasei (pentru
declararea obiectelor a, b, c, d de tip
dreprunghi)

LIMBAJUL C++
[

Declararea
claselor

[ class::objects::methods ]

Excepia de la aceast regul o constituie datele


membru statice, care exist ntr-un singur
exemplar, comun, pentru toate instanele clasei.

OPERATORUL DE REZOLUIE ::
2012/2013 - Suceava

n exemplul anterior, metoda seteaza_dimen este


doar declarat n interiorul clasei, fiind abia apoi
definit.
La definirea funciei
void dreptunghi::seteaza_dimen( double L, double l )
s-a folosit operatorul :: (scope resolution operator)
care specific relaia de apartenen a metodei la
tipul dreptunghi.
Operatorul cupleaz
nume_clasa::nume_functie_membru ii
definete domeniul (scopul) n care acea
funcie va fi recunoscut.

LIMBAJUL C++
[

Declararea
claselor

[ class::objects::methods ]

Prezena numelui clasei n faa funciei membru este


obligatorie, deoarece, altfel nu s-ar putea face
distincia ntre metode cu nume identice, care
aparin unor clase diferite.

OPERATORUL DE REZOLUIE ::
2012/2013 - Suceava
Operatorul de rezoluie apare utilizat n limbajul C++
n dou situaii:
la accesarea unor variabile mascate de
existena altor variabile locale

int x=2; //variabil extern

{
int x=3;
cout<< x << ::x; // afi. 3, 2
}

cout<<x; //afieaz 2

LIMBAJUL C++
[

Declararea
claselor

n cazul stabilirii apartenenei unei funcii la o


anumit clas:
q cazul definirii funciilor membre ale unei
clase

[ class::objects::methods ]

q cazul apelului unei funcii dintr-o clas


de baz mascat de o funcie n clasa
derivat

#include <stdio.h>

2012/2013 - Suceava

class Data
{
int _an, _luna, _zi; // sunt date membre
public:
// seteaza cele 3 date interne
void SetData( int an, int luna, int zi );
void Print( void ); // functie ce printeaza
// calculeaza diferenta de zile
ntre data
// curenta si data stocata la
adresa resp.
int NrZile( Data dc);
// ...
};

LIMBAJUL C++
[

Exemplu

[ class::objects::methods ]

char *luni[]= {"IANUARIE", "FEBRUARIE", "MARTIE",


"APRILIE", "MAI", "IUNIE", "IULIE", "AUGUST",
"SEPTEMBRIE","OCTOMBRIE", "NOIEMBRIE",
"DECEMBRIE"};
//sirul de mai sus este un pointer la char
void Data :: SetData( int an, int luna, int zi)
{
_an=an;
_luna=luna;
_zi=zi;
}
void Data :: Print(void)
{
printf("\n%4d %15s %3d", _an, luni[_luna], _zi);
}

// se considera ca fiecare luna are 30 zile


int Data :: NrZile( Data t )
{
//... DE FINALIZAT ACASA
int x;
x = t._an - _an;
x = t.an this -> _an;
return 0;
}

2012/2013 - Suceava

void main (void)


{
Data dn, dc;
dn.SetData( 1969, 4, 3 );
dc.SetData( 2001, 10, 12 );
dc.Print( );
printf("\n Nr zile trecute = %d ", dn.NrZile(dc) );
}

LIMBAJUL C++
[

Exemplu

]
TEMA

[ class::objects::methods ]

Finalizati clasa si implementati aplicatia


in Code::Blocks

S-ar putea să vă placă și