Sunteți pe pagina 1din 23

Structura celui mai simplu program C++

2012/2013 - Suceava
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
#include <iostream> Comentarii
#include <string>
using namespace std; Specidica domeniul
int main( void ) de acces a lui cout.
LIMBAJUL C++ { Se afla in std
cout << "Hello world!" << endl;
[ Cel mai simplu return 0;
program C++ ] }

Functia
main() indicand Inserarea in
inceputul fluxul de iesire
programului Sfarsitul executiei
main() ce corespunde
cu sfarsitul programului
[ class::objects::methods ]
Structura celui mai simplu program C++
2012/2013 - Suceava
in Borland C++ 3.1

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

int main( void )


LIMBAJUL C++ {
cout << "Hello world!" << endl;
[ Cel mai simplu return 0;
program C++ ] }

Functia
main() indicand Inserarea in
inceputul fluxul de iesire
programului Sfarsitul executiei
main() ce corespunde
cu sfarsitul programului
[ class::objects::methods ]
Stream-uri in C++
2012/2013 - Suceava

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++ Alt avantaj al folosirii stream-urilor se datoreaza
[ Cel mai simplu implementarii librariei iostream, care
program C++ ] utilizeaza un sistem de buffer-e.

[ class::objects::methods ]
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.
LIMBAJUL C++
[ Cel mai simplu ü clasele istream si ostream sunt derivate
program C++ ] 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.
[ class::objects::methods ]
Obiecte standard
2012/2013 - Suceava

Cand un program C++, ce


include iostream.h, este lansat in executie,
sunt create si initializate automat patru
obiecte:

ü cin gestioneaza intrarea de la intrarea


standard (tastatura).

ü cout gestioneaza iesirea catre iesirea


standard (ecranul).
LIMBAJUL C++
ü cerr gestioneaza iesirea catre dispozitivul
[ Stream-uri in C++ standard de eroare (ecranul), neutilizand
] buffer-e.

ü clog gestioneaza iesirea catre dispozitivul


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

[ class::objects::methods ]
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).

Sintaxa pentru operatii de iesire, cout:


cout << InformatieDeTrimisLaIesire;
LIMBAJUL C++
[ Stream-uri in C++ 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;
}

Acest scurt program citeste de la intrarea standard o valoare


intreaga, pe care o trimite apoi catre iesirea standard.
LIMBAJUL C++
Se observa posibilitatea de a utiliza simbolurile '\n', '\t', s.a.m.d
[ Stream-uri in C++ (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.

Deoarece cin este si el un obiect istream, valoarea returnata


de o operatie de citire/scriere din/in stream poate fi
[ class::objects::methods ] 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ă atât :

1. elementele de date (datele membre)


pentru care s-a adoptat un anumit
mod de reprezentare, cât şi

2. operaţiile asupra datelor (funcţiile


membre, metode).

În limbajul C++, structurile şi uniunile reprezintă


cazuri particulare ale claselor, putând
LIMBAJUL C++ avea:
[ Programare Orientata
1. nu numai date membre ( câmpuri de
pe Obiecte ] date ),

2. dar şi funcţii membre.

Observatie
Singura diferenţă între structuri şi uniuni
constă în faptul că la uniuni, pentru
memorarea valorilor datelor membre
[ class::objects::methods ]
se foloseşte aceeaşi zonă de memorie.
.
CLASE
2012/2013 - Suceava
Deosebirea esenţială î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 privaţi (membrii


sunt încapsulaţi).

Observatie
• Lipsa unor modalităţi de protecţie a datelor,
LIMBAJUL C++ face ca tipurile de date introduse prin
structuri sau uniuni să nu poată fi strict
[ Programare Orientata controlate în ceea ce priveşte operaţiile
pe Obiecte ] executate asupra lor.

• În cazul claselor, modul de acces la membrii


tipului de date (în scopul protejării acestora)
poate fi schimbat prin utilizarea
modificatorilor de control ai accesului:
• public,
• private,
[ class::objects::methods ] • protected.
2012/2013 - Suceava
STRUCTURA CLASA

Cuvânt cheie struct class


Declarare struct A{…}; class B {…};
variabile membre Struct A a, s[10]; class B b, s[20];
A a, s[10]; B b, s[20];

In Limbajul C:
• structura poate contine doar date
membre
LIMBAJUL C++
[ Comparatie • notiunea de clasa nu exista
class - struct ] In Limbajul C++:
• structura poate contine pe langa date
membre si functii

• implicit, specificatorul de acces la


membri este public

• la o clasa, acelasi specificator implicit,


[ class::objects::methods ] este private
2012/2013 - Suceava
Exemplu
struct MyBook
{
char title[64]; // Public implicit

void show_book( void )


{
puts( title );
};

void set_price( float amount)


{

LIMBAJUL C++
price = amount;
}
[ Comparatie
void set_title(char *name)
class - struct ] {
strcpy(title, name);
}

private:
float price;
};

[ class::objects::methods ]
2012/2013 - Suceava Sintaxa generala

class <ID_clasa> [ : [specif_acces]


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

LIMBAJUL C++ Exemplu


[ Declararea class deriv3 : public deriv1, private deriv2
claselor ] {
char nume[20];
// …
private:
int sum;
// …
public:
void put( int x );
// …
[ class::objects::methods ] } ob1, *pOb, sirOb[100] ;
2012/2013 - Suceava Sintaxa generala

În declaraţia de mai sus avem următoarele semnificaţii:

<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 moştenirii si poate fi:


q moştenire publică ( public )
q moştenire privată ( private, protected )

LIMBAJUL C++ care la rândul lor pot fi :


q moştenire simplă – derivă dintr-o singură clasă
[ Declararea q moştenire multiplă – derivă din mai multe clase
claselor ]
<lista_membrii> = lista tuturor membrilor clasei , formata din:
q date membre
q funcţii 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
LIMBAJUL C++ sirOb[ ] – un sir de obiecte
[ 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
2012/2013 - Suceava Obiecte

q Zonele sunt definite între două cuvinte cheie sau între un


cuvânt cheie şi specificatorul acces.

q Pentru compilatorul de C++ şi structurile sunt interpretate


ca având zone de acces doar că pentru o structură, unde
nu e specificată zona, este considerată implicit ca fiind
public, pe când la clase se consideră implicit private.

q Datele sau funcţiile 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
LIMBAJUL C++ accesată doar din interiorul clasei.

[ Declararea q Două obiecte aparţinând aceleiaşi clase pot să-şi


claselor ] acceseze datele private sau protected, în schimb două
obiecte aparţinând la clase diferite nu pot să-şi utilizeze
decât zona public sau cea de interfaţă.

[ class::objects::methods ]
Exemplu
2012/2013 - Suceava
class masina
{
// dată membru la care accesul este, implicit, private
char *culoare;

// dată membru la care accesul este, implicit, private


int capacit_cil;

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 Membrii culoare şi capacitate_cil (accesul private) pot fi accesaţi doar prin
claselor ] intermediul metodelor clasei.

class persoana
{
char *nume; //dată membru privată

public:
void citire_inf_pers() ;//metodă publică

private:
int varsta; //dată membru privată
[ class::objects::methods ] };
OPERATORI DE ACCES LA MEMBRU

2012/2013 - Suceava Operatorii de acces la membrii clasei sunt aceeaşi doi


operatori de la structuri :

Exemplu

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

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


int var;
var = ob1.x ; // greşit -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
funcţiile public ale unei clase pot returna valori private.
OPERATORUL DE REZOLUŢIE ::
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++ void dreptunghi::seteaza_dimen( double L, double l )


{ Lung=L; lat=l;
[ Declararea }

claselor ] 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 defineşte 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
funcţia main.

Membrii clasei dreptunghi


- Datele membru se alocă distinct pentru fiecare
instanţă (atribute ale instanţei) a clasei (pentru
declararea obiectelor a, b, c, d de tip
LIMBAJUL C++ dreprunghi)
[ Declararea
- Excepţia de la această regulă o constituie datele
claselor ] membru statice, care există într-un singur
exemplar, comun, pentru toate instanţele clasei.

[ class::objects::methods ]
OPERATORUL DE REZOLUŢIE ::
2012/2013 - Suceava
În exemplul anterior, metoda seteaza_dimen este
doar declarată în interiorul clasei, fiind abia apoi
definită.

La definirea funcţiei

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

s-a folosit operatorul :: (scope resolution operator)


care specifică relaţia de apartenenţă a metodei la
tipul dreptunghi.

Operatorul cuplează
nume_clasa::nume_functie_membru işi
LIMBAJUL C++ defineşte domeniul (scopul) în care acea
[ Declararea funcţie va fi recunoscută.

claselor ] Prezenţa numelui clasei în faţa funcţiei membru este


obligatorie, deoarece, altfel nu s-ar putea face
distincţia între metode cu nume identice, care
aparţin unor clase diferite.

[ class::objects::methods ]
OPERATORUL DE REZOLUŢIE ::
2012/2013 - Suceava

Operatorul de rezoluţie apare utilizat în limbajul C++


în două situaţii:

ü la accesarea unor variabile mascate de


existenţa altor variabile locale

int x=2; //variabilă externă

{
int x=3;
cout<< x << ::x; // afiş. 3, 2
}
LIMBAJUL C++ …
cout<<x; //afişează 2
[ Declararea …
claselor ]
ü în cazul stabilirii apartenenţei unei funcţii la o
anumită clasă:

q cazul definirii funcţiilor membre ale unei


clase

q cazul apelului unei funcţii dintr-o clasă


de bază mascată de o funcţie în clasa
derivată
[ class::objects::methods ]
#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);
// ...
};

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


"APRILIE", "MAI", "IUNIE", "IULIE", "AUGUST",
"SEPTEMBRIE","OCTOMBRIE", "NOIEMBRIE",
LIMBAJUL C++ "DECEMBRIE"};
//sirul de mai sus este un pointer la char
[ Exemplu ]
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);
[ class::objects::methods ] }
// se considera ca fiecare luna are 30 zile
int Data :: NrZile( Data t )
2012/2013 - Suceava {
//... DE FINALIZAT ACASA …
int x;
x = t._an - _an;
x = t.an – this -> _an;
return 0;
}

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

Finalizati clasa si implementati aplicatia


in Code::Blocks
[ class::objects::methods ]