Programare Orientata pe Obiecte


Alocare dinamica. Functii si date membre statice

Sa se implementeze clasa Student in care sa se exemplifice utilizarea functilor si datelor membre statice.

  1 #include <iostream>
    #include <conio.h>
    #include <string.h>
    
  5 using namespace std;
    
    class Student{
        private:
            int idObiect;
 10         char *nume;
            float media;
            static float MEDIE_MINIMA_BURSA; //retine media minima de la care se ia bursa
            static int ultimulIdGen; //utilizat pentru a genera id-uri unice pentru obiectele create.
            static int genereazaId();
 15     public:
            /** constructor implicit*/
            Student();
            /** constructor cu parametri*/
            Student(char *nume, float media=0);
 20         /** Constructor de copiere*/
            Student(const Student &s);
            ~Student();        
            void setNume(char *nume);
            char* getNume();
 25         void setMedia(float media);
            float getMedia();
            
            void afisare();
            int isBursier();
 30          
    };
    
    float Student::MEDIE_MINIMA_BURSA = 8.50;
    int Student::ultimulIdGen =0;
 35 
    int Student::genereazaId() {
                 return ++ultimulIdGen;
    }
    
 40 Student::Student(){
        idObiect = genereazaId();
        nume = NULL;
        media = 0;
        cout<<"Apel constructor implicit. Construit obiectul cu id-ul "<<idObiect<<endl;
 45 }
    
    Student::Student(char *nume, float media){
        idObiect = genereazaId();
        if (nume != NULL){
 50         this -> nume = new char[strlen(nume)+1];
            strcpy(this -> nume, nume);
        } else {
            this -> nume = NULL;
        }
 55     this -> media = media;
        cout<<"Apel constructor cu parametri. Construit obiectul cu id-ul "<<idObiect<<endl;
    }
    
    Student::Student(const Student &s){
 60     idObiect = genereazaId();
        if (s.nume != NULL){
            nume = new char[strlen(s.nume)+1];
            strcpy(nume, s.nume);
        } else {
 65         nume = NULL;
        }
        media = s.media;   
        cout<<"Constructor de copiere.Construit obiectul cu id-ul "<<idObiect<< " copie a ob. cu id-ul " <<s.idObiect<<endl;
    }
 70 
    Student::~Student(){
        if (nume != NULL){
            delete nume;
        }
 75     nume = NULL; 
        cout<<"Apel destructor. Distrus obiectul cu id-ul "<<idObiect<<endl; 
    }
    void Student::setNume(char *nume){
         if (nume != NULL){
 80          if (this-> nume != NULL){
                if (strlen(nume)> strlen(this->nume)){
                      delete this -> nume;       
                      this -> nume = new char[strlen(nume)+1];        
                }
 85          } else {
                 this -> nume = new char[strlen(nume)+1];        
             }    
            strcpy(this -> nume, nume);
        } else {
 90         // noul nume este null si deci si nume al obiectului curent va deveni null
            if (this -> nume != NULL){
                    delete nume;
            }
            this -> nume = NULL;
 95     }
    }
    
    void Student::setMedia(float media){
        this -> media = media;
100 }
    
    float Student::getMedia(){
        return media;
    }
105 
    void Student::afisare(){
        cout<<"ID:" << idObiect << endl;
        cout<<"Nume:" << (nume == NULL? "Necunoscut":nume) <<endl;
        cout<<"Media:" << media << endl;
110     cout<<"Bursier:" << (isBursier()?"da":"nu")<<endl;
    }
    
    int Student::isBursier(){
        return media>MEDIE_MINIMA_BURSA;
115 }
    Student test(Student p){
        cout<< "In functia test"<<endl;
        return p;
    }
120 
    int main(){
        cout<<"Aloc un tablou cu doua elemente"<<endl;
        Student *s =new Student[2];
        cout<<"Dupa alocarea de tablou"<<endl;
125     s[0].afisare();
        s[1].afisare();
        cout<<"Eliberez tabloul"<<endl;
        delete []s;
        cout<<"Construiesc un nou obiect"<<endl;
130     Student s2("Popescu");
        s2.afisare();
        s2.setMedia(9);
        s2.afisare();
        cout<<"Construiesc un nou obiect pe baza altuia"<<endl;
135     Student s3=s2;
        s3.setNume("Gigi");
        s3.afisare();
        s2.afisare();
        cout<<"Apelez functia test"<<endl;    
140     Student s4=test(s2);
        cout<<"Revenire din functia test"<<endl;
        s4.afisare();
        getch();
    }

In urma rularii programului se obtine urmatorul output:

Aloc un tablou cu doua elemente
Apel constructor implicit. Construit obiectul cu id-ul 1
Apel constructor implicit. Construit obiectul cu id-ul 2
Dupa alocarea de tablou
ID:1
Nume:Necunoscut
Media:0
Bursier:nu
ID:2
Nume:Necunoscut
Media:0
Bursier:nu
Eliberez tabloul
Apel destructor. Distrus obiectul cu id-ul 2
Apel destructor. Distrus obiectul cu id-ul 1
Construiesc un nou obiect
Apel constructor cu parametri. Construit obiectul cu id-ul 3
ID:3
Nume:Popescu
Media:0
Bursier:nu
ID:3
Nume:Popescu
Media:9
Bursier:da
Construiesc un nou obiect pe baza altuia
Constructor de copiere.Construit obiectul cu id-ul 4 copie a ob. cu id-ul 3
ID:4
Nume:Gigi
Media:9
Bursier:da
ID:3
Nume:Popescu
Media:9
Bursier:da
Apelez functia test
Constructor de copiere.Construit obiectul cu id-ul 5 copie a ob. cu id-ul 3
In functia test
Constructor de copiere.Construit obiectul cu id-ul 6 copie a ob. cu id-ul 5
Apel destructor. Distrus obiectul cu id-ul 5
Revenire din functia test
ID:6
Nume:Popescu
Media:9
Bursier:da
Apel destructor. Distrus obiectul cu id-ul 6
Apel destructor. Distrus obiectul cu id-ul 4
Apel destructor. Distrus obiectul cu id-ul 3       

Tema

  1. Implementati clasa Grupa ce cuprinte o lista a studentilor.

  2. Implementati clasa Matrice care sa reprezinte o matrice reprezentata sub forma liniara

  3. Explicati outpul programului prezentat mai sus.