Clasa este o reprezentare a unui tip de date abstracte. Ea asigura detaliile de implementare pentru structura de date si pentru operatii. Clasa defineste variabile (atribute) si functii (metode) care implementeaza structura de date si operatiile tipului abstract.
Un obiect este o instanta a unei clase (a unui tip abstract). El este unic identificat prin nume si defineste o stare reprezentata de valorile variabilelor (atributelor 828c23i ) la un moment dat. Comportarea unui obiect este definita de functiile (metodele) definite de clasa ce se pot aplica asupra lui. Definirea unei clase are forma
class nume_clasa
Clasele sunt definite utilizand cuvantul cheie class. Specificatorii de acces sunt public, protected si private. Implicit toti membri clasei sunt privati.
In limbajul C++ avem posibilitatea de a grupa anumite nume in spatii de nume. Prin definitie, datele si functiile unei clase constituie un spatiu de nume ce are numele clasei. Operatorul de rezolutie '::' arata ca un nume de data sau de functie apartine unui spatiu de nume. Operatorul de rezolutie '::' se utilizeaza pentru a defini o functie membru a clasei in afara clasei. Definirea functiilor membre ale unei clase se poate face, fie in interiorul clasei, fie in afara clasei, daca in interiorul clasei s-au declarat ca prototipuri.
Obiectele unei clase sunt create si initializate de functii membre ale clasei special definite pentru acest scop numite constructori. O functie constructor are numele clasei si nu are niciun tip (nu returneaza nicio valoare). Ea are prototipul
nume_clasa(lista de parametri)
Un constructorul unei clase este automat apelat de sistem la crearea unui obiect. O clasa poate avea mai multi constructori. Daca in program nu se defineste niciun constructor, compilatorul genereaza automat un constructor fara parametri, numit constructor implicit. Un tip de constructor este constructorul copiere care creaza o copie a unui obiect.
Obiectele sunt distruse cand nu mai sunt necesare de cǎtre functii membre ale clasei numite destructori. Functia destructor are prototipul
~nume_clasa();
Destructorul unei clase este apelat automat de sistem la distrugerea unui obiect. Destructorul nu are tip si nici parametri.
Apelul unei functii a clasei de catre un obiect se face cu o instructiune de forma
Nume_obiect.nume_functie(lista de parametri) ;
Utilizarea unui camp al unui obiect se face cu expresia
Nume_obiect.nume_camp
Probleme rezolvate
Problema 1. Sa se construiasca o clasa Complex pentru lucrul cu numere complexe. Partile reala si imaginara ale numarului complex sunt memorate in doua variabile tip double. Definitia clasei este
class Complex
Functia cabs() calculeaza modulul numarului complex. Functia conjg() conjuga numarul complex. Functia print() afisaza pe ecran numarul complex.
a) Prima varianta, in care functiile membre sunt definite in interiorul clasei.
#include<math.h>
#include<iostream.h>
class Complex
Complex(double x, double y) ;
double cabs();
void conjg()
void print()
void main()
Rezultatele rularii programului sunt cele de mai jos.
b) A doua varianta, in care functiile membre sunt definite in afara clasei. In acest caz utilizam operatorul de rezolutie '::' pentru a arata ca functiile definite in afara clasei sunt membre ale clasei.
# include <iostream.h>
# include <math.h>
class Complex
Complex::Complex()
;
Complex::Complex(double x, double y)
;
double Complex::cabs()
void Complex::conjg()
void Complex::print()
void main()
In general avem nevoie sa utilizam si sa modificam datele unui obiect in timpul executiei programului. Daca datele sunt declarate private, nu putem face acest lucru direct. O solutie este urmatoarea. Pentru ca o functie externa sa aibǎ acces la membri privati ai clasei, ea trebuie declarata in definitia clasei ca functie prietena, friend. Diagrama sintactica a definitiei unei functii prietene este
friend tip nume_functie ( parametri);
Vom aplica aceasta metoda in cazul definirii unor functii care sa efectueze operatii cu numere complexe.
Problema 2. Se vor construi functii globale care sa efectueze cele patru operatii cu numere complexe definite de clasa Complex din problema anterioara. Fie numerele complexe a = 1 + i, b = -2.3 + 4i, c = 4.1 - 2.2i. Se vor calcula expresiile a + bc*, (a + b)/ (a + c), abc.
#include<math.h>
#include<iostream.h>
class Complex
Complex(double x, double y) ;
double cabs();
friend Complex conjg();
void print()
friend Complex sum(Complex a, Complex b);
friend Complex dif(Complex a, Complex b);
friend Complex mul(Complex a, Complex b);
friend Complex div(Complex a, Complex b);
Complex Complex::conjg()
// sfarsit definire clasa
// definirea functiilor prietene
Complex dif(Complex a, Complex b)
Complex sum(Complex a, Complex b)
Complex mul(Complex a, Complex b)
Complex div(Complex a, Complex b)
void main()
Rezultatele rularii programului sunt cele de mai jos.
Probleme propuse
Problema 1. Sa se defineasca o clasa care sa descrie functia
f(x) = m*x + n
Numele clasei va fi Linie. Clasa va defini doua variabila de tip double, m si n, private. Clasa va defini urmatoarele functii
Constructor cu parametri a si b care va initializa variabilele m si n ale obiectului creat
Constructor tip copiere
Constructor implicit care initializeaza variabilele obiectului la valoarea zero
Functia
double value(double x) ;
care va calcula valoarea functiei in punctul x.
Functiile de acces
double getm();
double getn();
care dau valoarea variabilelor m si n ale obiectului.
Functiile de acces
void setm(double m);
void setn(double n);
care initializeaza variabilele m si n ale obiectului.
|