Sunteți pe pagina 1din 9

Curs 3: POO in C++ (Partea I Fiiere multiple)

Nu vom ncepe direct cu clase i obiecte ci mai nti vom nva s folosim fiiere multiple pentru utilizarea funciilor. 1. Primul program C++ 1. Creai un proiect nou te tipul Win32 Console Application, Empty Project 2. Adugai un nou item, un fiier surs cpp, numit main.cpp, urmnd aceti pai: - Mai nti alegei meniul Project i apoi Add New Item. - Alegei tipul de fiier C++ source File (.cpp) i tastai main ca i nume. Clic pe OK. Se va deschide fereastra de editare a fiierului main.cpp. 3. Adugai urmtorul cod n main.cpp
1 #include <iostream> 2 #include <conio.h> 3 using namespace std; 4 int main(){ 5 cout << "Hello World!" << endl; 6 _getch(); 7 return 0; 8}

4. Compilai i rulai ntr-o fereastr consol va apare urmtorul mesaj:


Hello World!

2. Functii S scriem acum o funcie numit printSomething() extinznd codul nostru dup cum urmeaz:
01 #include <iostream> 02 #include <conio.h> 03 using namespace std; 04 // functia 05 void printSomething(){ 06 cout << "I like pizza." << endl; 07 } 08 09 int main(){ 10 cout << "Hello World!" << endl; 11 printSomething(); // apelul functiei 12 _getch();

13 return 0; 14 }

- In linile 05-07 am definit funcia noastr printSomething. Linia 04 este doar un comentariu care este ignorat de C++. - In linia 11 apelm funcia. Compilai i rulai programul, i vei obine aceast ieire:
Hello World! I like pizza.

3. Prototipul funciei E posibil a se "sparge" funcia n dou pri: (i) prototipul (declaratia, antetul funciei) (ii) implementarea (definiia, corpul funciei) Modificm codul astfel:
01 #include <iostream> 02 #include <conio.h> 03 using namespace std; 04 // prototipul functiei 05 void printSomething(); 06 07 int main(){ 08 cout << "Hello World!" << endl; 09 printSomething(); _getch(); 10 return 0; 11 } 12 13 // implementarea funciei 14 void printSomething(){ 15 cout << "I like pizza." << endl; 16 }

- Linia 05 conine prototipul functiei. Acesta i "spune" lui C++ c exist o funcie numit printSomething(). - Liniile 14-16 conin implementarea funciei. Implementarea i "spune" lui C++ ce face functia printSomething(). Compilai i rulai programul. Va afia acelai rezultat. 4. Punerea implementrii ntr-un fiier distinct Lui C++ nu-i "pas" unde este localizat implementarea, nainte sau dup funcia main(). Ea poate fi chiar i n alt fiier. Important e s gseasc prototipul funciei nainte de funcia main(). Vom muta implementarea ntr-un alt fiier astfel: - Mai nti alegei meniul Project i apoi Add New Item. - Alegei tipul de fiier C++ source File (.cpp) i tastai impl ca i nume. Clic pe OK. Se va deschide fereastra de editare a fiierului impl.cpp. - Tiai cu Cut partea de implementare a funciei din fiierul main.cpp i lipii-o cu Paste n fiierul
2

impl.cpp. Cele dou fiiere ar trebui s fie ca mai jos: Fiierul main.cpp
01 //main.cpp 02 03 #include <iostream> 04 #include <conio.h> 05 using namespace std; 06 // prototipul functiei 07 void printSomething(); 08 09 int main(){ 10 cout << "Hello World!" << endl; 11 printSomething(); _getch(); 12 return 0; 13 }

Fiierul impl.cpp
1 //impl.cpp 2 3 #include <iostream> 4 using namespace std; 5 6 // implementarea 7 void printSomething(){ 8 cout << "I like pizza." << endl; 9}

Observai faptul c impl.cpp necesit liniile 03 i 04 deoarece utilizm cuvntul cheie cout. Compilai i rulai programul. Va afia acelai rezultat. 5. Punerea prototipului ntr-un fiier header Dup cum am menionant este important faptul ca prototipul funciei s fie ntotdeauna nainte de funcia main(). Putem pune ns i prototipul funciei printSomething() ntr-un alt fiier, astfel: - Mai nti alegei meniul Project i apoi Add New Item. - Alegei tipul de fiier Header File (.h) i tastai proto ca i nume. Clic pe OK. Se va deschide fereastra de editare a fiierului proto.h. - Tiai cu Cut prototipul funciei din fiierul main.cpp i lipii-l cu Paste n fiierul proto.h. Cele trei fiiere ar trebui s fie ca mai jos: Fiierul main.cpp
01 //main.cpp 02 #include <iostream> 03 #include <conio.h> 04 #include "proto.h"

05 using namespace std; 06 07 int main(){ 08 cout << "Hello World!" << endl; 09 printSomething(); _getch(); 10 11 return 0; 12 }

Fiierul impl.cpp
1 //impl.cpp 2 3 #include <iostream> 4 using namespace std; 5 6 // implementarea functiei 7 void printSomething(){ 8 cout << "I like pizza." << endl; 9}

Fiierul proto.h
1 // proto.h 2 3 // prototipul functiei 4 void printSomething();

Am tot spus c prototipul funciei trebuie s fie nainte de funcia main(). Totui, dac v uitai la main.cpp nu se vede niciun prototip al funciei printSomething(). Cu toate acestea prototipul este acolo prin intermediul liniei 04 a fiierului main.cpp: 04 #include "proto.h" Cu #include noi inserm coninutul fiierului proto.h chiar n linia 04, aa nct prototipul este ntradevr deasupra funciei main(). Compilai i rulai programul. Va afia acelai rezultat. 6. Exerciiu Scriei o funcie int aduna(int x, int y), care returneaz suma a dou numere date ca parametru. n programul principal main.cpp se citesc cele dou numere (n variabilele a i b) i se afieaz suma lor apelnd la funcia aduna (a,b). Prototipul funciei aduna se poata da fie n acelai fiier header proto.h sau n altul (de ex. Proto_ad.h, dar atunci trebuie i #include proto_ad.h scris n main.cpp), iar implementarea funciei se poate scrie tot n fiierul impl.cpp sau n alt fiier surs. Desigur exist i varianta de a scrie i prototipul i implementarea funciei tot n programul principal.

7. Rezumat - Fiierul header conine prototipuri, care sunt declaraii de funcii. - Implementarea poate fi pus ntr-un fiier separat (de ex. impl.cpp). - Fiierul header trebuie inclus cu directiva preprocesor #include "numeFisHeader.h" n fiierul principal.

Partea a II-a Clase i obiecte


n prima parte am nvat s utilizm fiiere multiple pentru funcii. Acum vom utiliza clase i obiecte. 1. Definirea unei clase Considerm acest exemplu: Albert Einstein, Frank Sinatra, Marie Curie, ce au acestea n comun? Evident, sunt persoane. Spunem c sunt obiecte ale clasei Persoana. In general, o clas descrie obiectele ei prin dou elemente: 1. Atribute (proprieti) 2. Metode (functii care pot accesa atributele i le pot modifica) Clasa Persoana ar putea avea atributele nume i varsta. i vom da i metoda vorbeste(), care va permite obiectelor noastre s vorbeasc. Pentru a crea clasa Persoana n C++: - Crem un nou proiect de tipul Win32 Console Application, Empty Project, numit ClasaPersoana. - Adugm un fiier surs de tip C++ file cu numele main - I in main.cpp:
01 #include <iostream> 02 #include <conio.h > 03 #include <string> 04 using namespace std; 05 06 // urmeaza definitia clasei "Persoana" 07 class Persoana{ 08 09 // atribute 10 private: 11 string nume; 12 int varsta; 13 14 // metode 15 public: 16 Persoana(string myName, int myAge){ 17 nume = myName; 18 varsta = myAge; 19 } 20

// metoda vorbeste()

21 void vorbeste(){ 22 cout << "Salut! Ma numesc " << nume << " si am " << varsta<< " ani." << endl; 23 } 24 }; // <---Nu uitati punct virgula aici! 25 26 27 // functia main() 28 int main(){ 29 30 Persoana p("Homer", 42); // Creaza un obiect de clasa "Persoana" 31 p.vorbeste(); // facem obiectul s vorbeasca 32 _getch(); 33 return 0; 34 }

- In liniile 07-24 am definit clasa noastra Persoana. - Liniile 10-12 contin atributele (proprietile) care descriu un obiect de tipul Persoana. Cuvantul cheie private nseamn c doar metodele (functiile) pot accesa atributele. - Liniile 15-23 contin metodele (functiile). Observai cuvntul cheie public care nseamn c putem aplica operatorul punct la obiectul nostru. Vom vedea mai jos ce nseamn acest lucru.. - Liniile 16-19 ne arat asa-numitul constructor. Constructorul este pur i simplu o metod special cu urmtorele proprieti: (i) ntotdeauna are acelai nume ca i clasa. (ii) nu are un tip returnat. (iii) El iniializeaz, adic asigneaz valori iniiale atributelor. - Liniile 21-23 arat metoda vorbeste(). Aceasta acceseaz atributele pentru a face obiectul s vorbeasc. - Linia 24 este important: Nu uitai punct virgula care marcheaz sfritul clasei. - Liniile 28-34 arat funcia main(). Liniile 28, 33 i 34 fac parte ntotdeauna din funcia main(). - In linia 30 cream un obiect de clas Persoana. Numele obiectului este siimplu p . Dup p transmitem i numele i varsta, n acest caz Homer este numele i 42 este vrsta, de aceea scriem Persoana p(Homer, 42). - In linia 31 facem obiectul p s vorbeasc, aplicndu-i operatorul punct, astfel: p.vorbeste(). Compilai i rulai programul i ar trebui s obinei urmtoarea ieire la consol:
Salut! Ma numesc Homer si am 42 ani.

2. Spargerea clasei n declaraie i implementare, similar cu prima parte a tutorialului. Modificai fiierul main.cpp dup cum urmeaz:
01 #include <iostream> 02 #include <conio.h> 03 #include <string> 04 using namespace std; 05 06 // definirea clasei "Persoana" 07 class Persoana{ 08

09 // atribute 10 private: 11 string nume; 12 int varsta; 13 14 // metode, acum doar cu prototipul functiei (declaratia) 15 public: 16 Persoana(string myName, int myAge); 17 void vorbeste(); 18 19 }; // <--- Nu uitati punct virgula aici! 20 21 22 23 // functia main() 24 int main(){ 25 26 Persoana p("Homer", 42); 27 p.vorbeste(); 28 _getch(); 29 return 0; 30 } 31 32 33 // implementarea metodelor 34 // Observati notatia "Persoana::" inainte de numele functiei 35 Persoana::Persoana(string myName, int myAge){ 36 nume = myName; 37 varsta = myAge; 38 } 39 40 void Persoana::vorbeste(){ 41 cout << "Salut! Ma numesc " << name << " si am " << age << " ani." << endl; 42 }

- In liniile 07-19 avem clasa Persoana. Observai liniile 16 i 17. Aceste linii conin doar prototipurile funciilor (declaraiile) fr implementare! - Implementarea este acum n liniile 35-42. Observai cum am folosit notaia Persoana:: in faa numelor de funcii. Acest lucru este necesar deoarece altminteri C++ nu tie de care clas aparine implementarea. Compilai i rulai codul, i vei obine acelai rezultat. 3. Utilizarea unui fiier header Vom utiliza acum fiiere multiple. a) Definiia clasei Persoana care conine doar declaraia (i nu i implementarea!) o punem ntr-un fiier header, numit persoana.h.

b) Implementarea o vom pune ntr-un fiier numit persoana.cpp. c) n main.cpp vom include fiierul header cu #include persoana.h. Fiierele vor arta ca mai jos:: a) fiierul header persoana.h
01 #ifndef PERSOANA_H // acesta este asa-numitul "include guard" 02 #define PERSOANA_H 03 04 #include <string> 05 using namespace std; 06 07 // definitia clasei "Persoana" 08 class Persoana{ 09 10 // atribute 11 private: 12 string nume; 13 int varsta; 14 15 // metodele, acum doar cu prototipul functiei (declaratia) 16 public: 17 Persoana(string myName, int myAge); 18 void vorbeste(); 19 20 }; // <--- Nu uitati punct virgula aici! 21 22 #endif

- Liniile 01, 02 i 22 formeaz aa-numita include guard. Atunci cnd C++ include acest fiier header pentru prima oar, i asigneaz numele PERSOANA_H. Dac se ncearc a se include acest fiier header a doua oar, ceea ce ar conduce la o eroare, C++ verific dac numele PERSOANA_H exist deja. Deoarece PERSOANA_H exist deja de la primul #include, fiierul header nu este inclus din nou, ceea ce previne generarea unei erori. b) fiierul de implementare persoana.cpp
01 #include "persoana.h" // aceasta include continutul lui persoana.h aici 02 // Acest lucru este necesar deoarece altminteri C++ nu stie 03 // ce inseamna Persoana::de mai jos. 04 #include <iostream> 05 06 // implementarea metodelor 07 // Observati notatia "Persoana::" in fata numelor functiilor 08 Persoana::Persoana(string myName, int myAge){ 09 nume = myName; 10 varsta = myAge; 11 } 12

13 void Persoana::vorbeste(){ 14 cout << "Salut! Ma numesc " << nume << " si am " << varsta << " ani." << endl; 15 }

persoana.cpp conine implementarea funciilor. Observai c n linia 01 a trebuit s includem fiierul header. Acest lucru este necesar deoarece altfel C++ se va plnge c nu nelege ce nseamn Persoana::. 3. fiierul main.cpp
01 #include <iostream> 02 #include <string> 03 #include "persoana.h" // acest include servete ca un fel de prototip 04 // amintiti-va ca prototipul trebuie sa fie intotdeauna 05 // deasupra functiei main(). 06 #include <conio.h>; 07 using namespace std; 08 09 // functia main() 10 int main(){ 11 12 Persoana p("Homer", 42); 13 p.vorbeste (); 14 _getch(); 15 return 0; 16 }

- In linia 03 am inclus fiierul header persoana.h. Putei s v nchipuii ca i cum ai fi inclus aici prototipul funciei, care trebuie s fie ntotdeauna deasupra funciei main(). Compilai i rulai programul. Vei obine acelai rezultat ca nainte. 4. Exerciiu Creai un alt obiect: Persoana p2. Numele persoanei este Carmen i varsta este 25. Facei-o s vorbeasc. Soluie: Adugai n funcia main() nainte de linia 14 urmtorul cod:
Persoana p2("Carmen", 25); p2.vorbeste();

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