Documente Academic
Documente Profesional
Documente Cultură
NOTE DIGITALE
B.TECH
(Anul I – SEM II)
(2018-19)
LNVETOLEARN&LEARNTO
Obiectivele
• Pentru a preda elevului conceptele de programare orientată pe obiecte și proceduri
• Pentru a diferenția între funcții, clase și obiecte
• Pentru a învăța să supraîncărcați funcțiile și operatorii
• Pentru a proiecta aplicații utilizând tehnici de gestionare dinamică a memoriei
• Pentru a învăța elevul să implementeze programarea generică și gestionarea excepțiilor
Unitatea I
Introducere în programarea orientată pe obiecte: Paradigma orientată pe obiecte - Diferențele
dintre programarea orientată pe obiecte și programarea orientată pe proceduri, Conceptele de bază
ale programării orientate pe obiecte, Încapsularea, Moștenirea și polimorfismul, Beneficiile OOP,
Structura unui program C ++, spațiul de nume, Tipuri de date, jetoane C ++, Identificatori, Variabile,
Constante, Operatori, Structuri de control și bucle.
Unitatea II
Funcții, clase și obiecte:
Introducerea claselor, definirea clasei, definirea unui membru, obiecte, controlul accesului, domeniul
de aplicare al clasei, operatorul rezoluției domeniului, funcțiile inline, alocarea memoriei pentru
obiecte, membrii datelor statice, funcțiile statice ale membrilor, matricele de obiecte, obiectele ca
argumente funcționale, funcțiile prieten.
Unitatea III
Constructori, distrugători, moștenitori:
Introducere în constructori, constructori impliciti, constructori parametrizați, constructori de copii,
constructori multipli într-o clasă, distrugători.
Moștenire:
Introducere în moștenire, Definirea claselor derivate, Moștenire unică, Moștenire multiplă,
Moștenire pe mai multe niveluri, Moștenire ierarhică, Moștenire hibridă.
Unitatea IV
Indicatori, funcții virtuale și polimorfism:
Introducere în gestionarea memoriei, operator nou și operator de ștergere, Pointeri către obiecte,
Pointeri către clase derivate, Polimorfism, Polimorfism de timp de compilare, Polimorfism de timp de
execuție, Funcții virtuale, Supraîncărcare - Supraîncărcare funcție, Supraîncărcare operator.
Unitatea V
Șabloane și tratarea excepțiilor:
Introducere în șabloane, șabloane de clasă, șabloane de clasă cu parametri multipli, șabloane de
funcții, șabloane de funcții cu parametri multipli.
Tratarea excepțiilor:
Elementele de bază ale tratării excepțiilor, Tipuri de excepții, Mecanismul de tratare a excepțiilor,
Mecanismul de aruncare și prindere, Revocarea unei excepții, specificarea excepțiilor.
Rezultate:
• Pentru a diferenția programarea orientată pe obiecte și programarea procedurală.
• Pentru a construi clase, funcții și obiecte
• Pentru a pune în aplicare constructorii, distrugătorii și moștenirea
• Dezvoltarea programelor folosind tehnici de gestionare dinamică a memoriei
• Pentru a aplica tratarea excepțiilor și programarea generică.
Manuale:
1. Programare orientată pe obiecte cu C ++ de Balagurusamy
2. C++, referința completă, ediția a4-a , Herbert Schildt, TMH.
Referinţe:
1. C++ Primer, edițiaa 3-a , S.B.Lippman și J.Lajoie, Pearson Education.
2. Limbajul de programare C++, edițiaa 3-a , B.Stroutstrup, Pearson Educ
UNITATEA -1
Concepte de programare orientată pe obiecte: Diferențe de paradigmă orientate obiect între programarea
orientată pe obiecte și programarea orientată pe proceduri, conceptele de bază ale programării orientate pe
obiecte, încapsularea, moștenirea și polimorfismul. Beneficiile OOP . Structura unui program C ++, spațiu de
nume, tipuri de date, jetoane C ++, identificatori, variabile, constante, operatori, structuri de control și bucle.
Extragerea datelor:
Abstractizarea se referă la actul de reprezentare a caracteristicilor esențiale fără a include
detaliile sau explicațiile din spatele terenului. Clasele folosesc conceptul de abstractizare și sunt definite ca o listă
de atribute, cum ar fi dimensiunea, greutatea, costul și funcțiile care operează asupra acestor atribute. Ele
încapsulează toate proprietățile esențiale ale obiectului care urmează să fie creat. Atributele sunt numite membri
ai datelor, deoarece dețin date, iar funcțiile care operează asupra acestor date sunt numite funcții membru.
Clasa utilizează conceptul de abstractizare a datelor, astfel încât acestea se numesc tip de date abstracte
(ADT)
Polimorfism: Polimorfismul provine din cuvintele grecești "poli" și "morfism". "poli" înseamnă multe, iar
"morfism" înseamnă formă, adică multe forme. Polimorfismul înseamnă capacitatea de a lua mai mult de o formă.
De exemplu, o operațiune are un comportament diferit în diferite cazuri. Comportamentul depinde de tipul de date
utilizate în operațiune.
Diferite modalități de realizare a polimorfismului în programul C ++:
1) Supraîncărcarea funcției 2) Supraîncărcarea operatorului
#include<iostream>
Utilizarea spațiului de nume
Std; int main() {int a=4; a=a<<2;
cout<<"a="<<a<<endl;
returnare 0;
}
Moștenire: Moștenirea este procesul prin care un obiect poate dobândi proprietățile altuia.
Moștenirea este cel mai promițător concept al OOP, care ajută la realizarea obiectivului de a construi software din
părți reutilizabile, mai degrabă decât codificarea manuală a fiecărui sistem de la zero. Moștenirea nu numai că
acceptă reutilizarea între sisteme, ci și facilitează direct extensibilitatea în cadrul unui sistem. Moștenirea cuplată
cu polimorfismul și legarea dinamică minimizează cantitatea de cod existent care trebuie modificată,
îmbunătățind în același timp un sistem.
Când copilul clasei, moștenește părintele clasei, copilul clasei este denumit clasă derivată (subclasă) și
părintele clasei ca clasă de bază (super clasă). În acest caz, copilul clasei are două părți: o parte derivată și o parte
incrementală. Partea derivată este moștenită de la părintele clasei. Partea incrementală este noul cod scris special
pentru copilul clasei.
Legare dinamică:
Legarea se referă la conectarea apelului de procedură la codul care trebuie executat ca răspuns la apel.
Legare dinamică (sau legare târzie) înseamnă codul asociat cu un anumit apel de procedură necunoscut până la
momentul apelului la momentul rulării.
Transmiterea mesajului:
Un program orientat obiect constă dintr-un set de obiecte care comunică între ele.
Obiectele comunică între ele prin trimiterea și primirea de informații .
Un mesaj pentru un obiect este o cerere de executare a unei proceduri și invocă funcția care este chemată
pentru un obiect și generează rezultat
Ușor de întreținut și actualizat: OOP facilitează menținerea și modificarea codului existent, deoarece pot fi create
obiecte noi cu mici diferențe față de cele existente. Complexitatea software-ului poate fi gestionată cu ușurință.
Transmiterea mesajului: Tehnica comunicării mesajelor între obiecte facilitează interfața cu sistemele externe.
Modificabilitate: este ușor să faceți modificări minore în reprezentarea datelor sau procedurile într-un
program OO. Schimbările din interiorul unei clase nu afectează nicio altă parte a unui program, deoarece
singura interfață publică pe care lumea exterioară o are cu o clasă este prin utilizarea metodelor.
STRUCTURA DE BAZĂ A LIMBAJULUI C++: Programul scris în limbajul C ++ urmează această structură
de bază. Secvența secțiunilor ar trebui să fie așa cum sunt în structura de bază. Un program C ar trebui să aibă una
sau mai multe secțiuni, dar trebuie urmată succesiunea secțiunilor.
1. Secțiunea de documentare
2. Secțiunea de legătură
3. Secțiunea de definiții
4. Declarația globală, secțiunea și declarațiile de clasă
5. Definiția funcției membrului
6. Funcția principală
secțiunea main() {
Secțiunea declarație Secțiunea executabilă
1. SECȚIUNEA DE DOCUMENTAȚIE : este prima și este utilizată pentru a documenta utilizarea
logicii sau a motivelor în programul dvs. Poate fi folosit pentru a scrie detaliile obiective, dezvoltator și logice ale
programului. Documentarea se face în limbajul C cu /* și */ . Orice este scris între aceste două se numesc
comentarii.
2. SECȚIUNEA DE LEGĂTURĂ: Această secțiune spune compilatorului să lege anumite
apariții ale cuvintelor cheie sau funcțiilor din programul dvs. la fișierele antet specificate în această
secțiune.
de exemplu, #include<iostream>
folosind spațiul de nume std;
Directiva determină preprocesorul să adauge conținutul fișierului IOSTREAM la program. Acesta conține declarații pentru cout și
cin.
>
COUT este un obiect predefinit care reprezintă fluxul de ieșire standard. Operatorul << este un
operator de inserare, determină afișarea șirului între ghilimele duble pe ecran.
Declarația cin>>n; este o instrucțiune de intrare și determină programul să aștepte ca utilizatorul să introducă un
număr. Numărul tastat este plasat pe variabila "n". Identificatorul cin este un obiect predefinit în C++ care
corespunde fluxului de intrare standard. Operatorul >> este cunoscut sub numele de operator de extracție. Extrage
valoarea de pe tastatură și o atribuie variabilei de valoare din dreapta sa.
3. DEFINIȚIE SECȚIUNE: Este folosit pentru a declara unele constante și a le atribui unele
valoare. de ex. #define MAX 25
Aici #define este o directivă compilator care spune compilatorului ori de câte ori MAX este găsit
în program, înlocuiți-l cu 25.
4. SECȚIUNEA DECLARAȚIA GLOBALĂ: Aici variabilele și sfidările de clasă care sunt utilizate pe
tot parcursul programului (inclusiv funcțiile principale și alte funcții) sunt declarate astfel încât să le facă globale
(adică accesibile tuturor părților programului). O CLASĂ este o colecție de date și funcții care acționează sau
manipulează datele. Componentele de date ale unei clase se numesc membri de date , iar componentele
funcționale ale unei clase se numesc funcții membre
O clasă ca, denumită și un plan sau prototip care definește variabila sau funcțiile comune tuturor
obiectelor de un anumit tip. Este un tip de date definit de utilizator
de ex.
Afișaj gol()
{
cout<<"C++ este mai bun decât C";
}
PROGRAMUL SIMPLU "C++":
#include<iostream>
folosind spațiul de nume std;
Afișaj gol()
{
cout<<"C++ este mai bun decât C";
}
int main()
{
afișaj()
returnare 0;
}
Spațiu de nume:
Spațiul de nume este utilizat pentru a defini un domeniu care ar putea conține identificatori globali.
Ex:-Domeniul de aplicare al spațiului de nume pentru biblioteca standard C ++.
O clasă, funcții și șabloane sunt declarate în spațiul de nume numit
std folosind spațiul de nume std;-->directivă poate fi utilizată.
#include<iostream>
Această directivă determină preprocesorul să adauge conținut de fișier iostream la program. unele versiuni
vechi de C ++ utilizate iostream.h .dacă complier nu acceptă ANSI (American Nation Standard Institute)
C ++, apoi utilizați fișierul antet iostream.h
TIPURI DE DATE:
Un tip de date este utilizat pentru a indica tipul de valoare a datelor stocate într-o variabilă. Toate
compilatoarele C acceptă o varietate de tipuri de date. Această varietate de tipuri de date permite
programatorului să selecteze tipul adecvat nevoilor aplicației, precum și mașinii. ANSI C acceptă
următoarele clase de date:
, । । .......
Bitul semnat Magnitudine
MSB (cel mai semnificativ bit)
100(10)=00000000001100100(2)
Reprezentarea numărului negativ :
-100(10)=1111111110011100(2)
Numere întregi nesemnate: Numerele întregi nesemnate utilizează toți cei 16 biți pentru a stoca magnitudinea.
Stochează numerele nu au niciun calificator de semne și dimensiuni și intervalul de date întregi tip pe 16 biți și
mașină sunt prezentate în tabel:
MEMORIE NECESARĂ
GAMA
SAU DIMENSIUNEA DE FORMATU
TIP DE DATE STOCARE
TURBO C ÎN OCTEȚI GCC/ TURBO C (16 BIȚI) GCC L SPECIER
(16 BIȚI) COMPILATOARE ÎN
(PE 32 DE BIȚI)
LINUX (32 BIȚI)
int scurt -32768
-32768 Până la 32767
sau 2 2 %hd
Până la 32767 (-2 până (-2 până la +2
semnat scurt int la +2 -1) -1)
int scurt
0 până la 65535 (de la 0 0 până la 65535 (de la 0 la
sau la +2 -1) +2 -1)
semnat scurt int 2 2 %hu
Numărul în virgulă mobilă reprezintă un număr real cu o precizie de 6 cifre, ocupă 4 octeți de memorie.
Variabilele în virgulă mobilă sunt declarate prin flotarea cuvântului cheie.
Tipul de date cu virgulă mobilă dublă ocupă 8 octeți de memorie, oferind o precizie de 14 cifre. Acestea sunt, de
asemenea, cunoscute sub numele de numere de precizie dublă. Variabilele sunt declarate prin cuvinte cheie: dublu
, lung, dublu se referă la un tip de date în virgulă mobilă care este adesea mai precis decât dubla precizie.
Dimensiunea și intervalul tipului de date în virgulă mobilă sunt prezentate în tabel:
Tip de date Dimensiune (memorie) Gama Specificator de
(cuvânt cheie) format
Pluti 32 biți (4 octeți) 3.4E-38T03.4E+38 %f
Dublu 64 biți (8 octeți) 1.7E-308 până la I.7E +308 %lf
dublă lungă 80 biți (10 octeți) 3.4E-4932 până la Lf
B Tip de date oolean: - 1.1E+4932
Tipul de date booleene sau logice este un tip de date, având două valori (de obicei notate adevărat și fals),
destinat să reprezinte valorile de adevăr ale logicii și algebrei booleene. Este numit după George Boole, care a
definit pentru prima dată un sistem algebric de logică la mijlocul secolului al 19-lea. Tipul de date boolean este
rezultatul principal al instrucțiunilor condiționale, care permit acțiuni diferite și modifică fluxul de control în
funcție de evaluarea unei condiții booleene specificate de programator la adevărat sau fals.
C99 a adăugat un tip boolean (adevărat/fals) care este definit în antetul <stdbool.h> Variabila booleană este
definită de cuvântul kkey bool ; Ex:
Bool B;
unde b este o variabilă care poate stoca true(1) de fals (0)
Tipul vid
Tipul vid nu are valori. Acesta este de obicei utilizat pentru a specifica tipul de funcții returnate. Tipul funcției despre care se
spune că este nulă atunci când nu returnează nicio valoare funcției de apelare. Acest lucru este, de asemenea, utilizat pentru
declararea indicatorului de uz general numit indicator vid.
Tipuri de date derivate.
Tipurile de date derivate sunt Matrice, indicatorul și referințele sunt exemple pentru tipurile de date
derivate.
Tipuri de date definite de utilizator:
Acestea Tipurile de date definite de utilizator sunt cunoscute sub numele de tipuri de date definite de utilizator.
Ele sunt structura, uniunea, clasa și enumerarea
Jetoane C++
IDENTIFICATORI: Identificatorii sunt numele date diferitelor elemente ale programului, cum ar fi variabilele,
funcțiile și matricele. Acestea sunt nume definite de utilizator constând din secvențe de litere și cifre.
Norme pentru declararea identificatorilor:
Primul caracter trebuie să fie un alfabet sau un caracter de subliniere.
> Acesta trebuie să fie format numai din litere, cifre și caractere de subliniere.
Identificatorii pot avea orice lungime, dar numai primele 31 de caractere sunt semnificative.
> Nu trebuie să conțină spațiu alb sau spațiu gol.
Nu ar trebui să folosim cuvinte cheie ca identificatori.
> Literele mari și minuscule sunt diferite.
Exemplu: ab Ab aB AB sunt tratate diferit
Exemple de identificatori validi:
a, x, n, num, SUM, fapt, grand_total, sum_of_digits, sum1
Notă: Unii compilatori de C recunosc doar primele 8 caractere; Din acest motiv, ei nu pot distinge identificatorii
cu cuvinte cu o lungime mai mare de opt caractere.
Declarație variabilă: Declarația variabilei dă numele pentru locația memoriei și dimensiunea acesteia și
Specifică intervalul de valori care poate fi stocat în locația
Sintaxă:
respectivă.
Numele variabilei de tip
date; A 10 2000
Ex:
int a=10; x 2.300000 5000
float x=2,3;
CUVINTE CHEIE:
Există anumite cuvinte, numite cuvinte cheie (cuvinte rezervate) care au un sens predefinit în
limbajul "C++". Aceste cuvinte-cheie trebuie utilizate numai în scopul preconizat și nu ca identificatori.
Tabelul următor prezintă cuvintele cheie standard "C++"
automobil sparge caz Char Const continua
Implicit face dublu altfel Enum extern
pluti pentru Goto dacă Int lung
Înregistrează- restitui scurt Semnat Dimensiunea: static
teStruct comutator tipdef uniune Nesemnate nul
volatil vreme .class prieten nou șterge
acest public privat protejat Inline încerca
arunca prinde șablon
CONSTANTE:
Constantele se referă la valori care nu se modifică în timpul executării unui program.
Constantele pot fi împărțite în două categorii majore:
1.Constante primare:
a)Constante numerice
Constante întregi.
Virgulă mobilă (reală)
Constante. b)Constante de caractere
Constante cu un singur caracter Constante șir
2.constante secundare:
Constante de enumerare.
Constante simbolice.
Matrice, sindicate etc.
Reguli pentru declararea constantelor:
1 . Virgulele și spațiile libere nu sunt permise în cadrul constantei.
2 . Constanta poate fi precedată de semnul minus (-), dacă este necesar.
3 . Valoarea unei constante trebuie să se încadreze în limitele minime ale tipului său de date specificat.
Constante întregi: O constantă întreagă este un număr cu valoare întreagă. Se compune din secvența de cifre.
Constantele întregi pot fi scrise în trei sisteme de numere diferite:
1 . Număr întreg zecimal (în baza 10).
2 . Număr întreg octal (baza 8).
3 . Hexazecimal (în baza 16).
Constanta întreagă zecimală: Se compune dintr-un set de cifre, de la 0 la 9.
Declarație valabilă: 0, 124, -56, + 67, 4567 etc.
Declarație invalidă: 245 USD, 2,34, 34 345, 075.
23.345,00. Este, de asemenea, o declarație invalidă.
Notă: Spațiile încorporate, virgulele, caracterele, simbolurile speciale nu sunt permise între cifre
Magnitudinea (valoarea maximă) a unei constante întregi poate varia de la zero la o valoare maximă care variază
de la un computer la altul.
Valorile maxime tipice pentru majoritatea computerelor personale sunt: (mașini pe 16 biți)
Constanta zecimală a numerelor întregi: 32767 (215-1)
Constanta întreagă octală: 077777
Constanta întreagă hexazecimală: 0X7FFF
Notă: Cea mai mare valoare care poate fi stocată depinde de aparat.
Constante în virgulă mobilă sau constante reale: Numerele cu părți fracționate se numesc constante reale.
Acestea sunt numerele cu baza 10 care conține fie o parte zecimală, fie un exponent (sau ambele). Reprezentare:
Aceste numere pot fi reprezentate fie în notație zecimală, fie în notație exponentă (notație științifică).
Notație zecimală: 1234.56, 75.098, 0.0002, -0.00674 (notații valide)
Exponent sau notație științifică:
Forma generală: Mantissa e exponent
Mantissa: Este un număr real exprimat în notație zecimală sau într-o notație întreagă.
Exponent: Este un număr întreg cu semnul opțional plus (+) sau minus (-).
E sau e: Litera care separă mantissa și partea zecimală.
Ex: (Notații valide)
3
1.23456E+3 (1.23456×10 )
1
7.5098 E+1 (7.5098×10 )
-4
2E-4 (2×10 )
Aceste notații exponențiale sunt utile pentru reprezentarea numerelor care sunt fie foarte mari, fie foarte
mic. Ex: 0.00000000987 este echivalent cu 9.87e-9
Constante de caracter:-
Constante cu un singur caracter: Este caracter (sau orice simbol sau cifră) inclus între ghilimele simple.
Ex: "a‟ "1‟ "*‟
Fiecare constantă de caracter are valori întregi cunoscute sub numele de valori ASCII
ASCII:- ASCII înseamnă American Standard Code for Information Interchange. Pronunțat ask-ee, ASCII este un cod pentru
reprezentarea caracterelor englezești ca numere, cu fiecare literă atribuită unui număr de la 0 la 255.Computerele pot înțelege
doar numerele, astfel încât un cod ASCII este reprezentarea numerică a unui caracter, cum ar fi "a" sau "@" sau o
acțiune de un fel. Codurile SCII reprezintă textul din computere, echipamente de comunicații și alte dispozitive care
utilizează text. Majoritatea schemelor moderne de codificare a caracterelor se bazează pe ASCII, deși acceptă multe caractere
suplimentare. Mai jos este tabelul de caractere ASCII, care include descrieri ale primelor 32 de caractere care nu se imprimă.
Constante șir sau șir literal:
Constanta șir este o secvență de zero sau mai multe caractere încadrate de ghilimele duble.
Exemplu:
"MRCET" "12345" "*)(&%"
Secvențe de evadare sau constante de caractere bară oblică inversă
Limbajul C acceptă unele caractere neimprimabile, precum și backslash ( \ ) care pot fi exprimate
ca secvențe de evadare. O secvență de evadare începe întotdeauna cu o bară oblică urmată de unul sau mai multe
personaje speciale.
De exemplu, un nou caracter linie este reprezentat "\n" sau endl
Acestea sunt utilizate în formatarea ecranului de ieșire, adică secvența de evacuare este utilizată în
funcții de ieșire. Unele secvențe de evadare sunt prezentate mai jos:
1. OPERATORI ARITMETICI: Toți operatorii aritmetici de bază sunt prezenți în operatorul C. rost
+ adăuga
- Scăderea
* înmulțirii
/ divizie
% Diviziunea MODULO (rest)
O operație aritmetică care implică numai operanzi reali (sau operanzi întregi) se numește aritmetică reală
(sau aritmetică întreagă). Dacă o combinație de aritmetică și reală se numește aritmetică în mod mixt.
/*C program pe expresii aritmetice întregi*/
#include<iostraem.h>
vid principal()
{
int a, b;
cout<"Introduceți oricare două numere întregi";
cin>>a>>b;
cout<<"a+b"<< a+b;
cout<<"a-b"<< a-b;
cout<<"a*b"<< a*b;
cout<<"a/b"<< a/b;
cout<<"a%b"<< a%b;
}
IEŞIRE:
a+b=23
a-b=17
a*b=60
a/b=6
a% b=2
2. OPERATORI RELAȚIONALI : Adesea comparăm două cantități și, în funcție de relația lor, luăm anumite
decizii, pentru acea comparație folosim operatori relaționali.
operator rost
IEȘIRE: 0&&0=0
0&&1=0
1&&0=0
1&&1=1
0||0=0
0||1=1
1||0=1 1||1=1 !0 =1 !1 =0
4 . OPERATOR DE ATRIBUIRE:
Expresia de atribuire evaluează operandul din partea dreaptă a operatorului (=) și plasează valoarea
acestuia în variabila din stânga.
Notă: Operandul stâng dintr-o expresie de atribuire trebuie să fie o singură variabilă.
Există două forme de atribuire:
•Atribuire simplă
•Atribuire compusă
Atribuire simplă:
În expresiile algebrice am găsit aceste expresii.
Ex: a=5; a = a + 1; a=b+1;
Aici, operandul din partea stângă trebuie să fie o variabilă, dar nu o constantă. Variabila din partea stângă
trebuie să poată primi o valoare a expresiei. Dacă operandul din stânga nu poate primi o valoare și îi
atribuim una, primim o eroare de compilare.
Atribuire compusă:
O atribuire compusă este o notație prescurtată pentru o atribuire simplă. Este nevoie ca operandul stâng să
fie repetat ca parte a expresiei corecte. Sintaxă: operator variabil + = valoare
Ex:
A+=1; este echivalent cu A=A+1;
Operatorul ++ adaugă unul la operandul său, unde operatorul - - scade unul din operandul său. Acești operatori sunt
operatori unari și să ia următoarea formă:
Operator Descriere
Atât operatorii de creștere, cât și cei descrescători pot
preceda sau urma operandul. -—a Pre-incrementare
Postfix Increment/Decrement :( a++/a--) A++ Post-incrementare
În incrementul postfix (Decrement) valoarea este —o Pre-decrement
incrementată (descrescătoare) cu unu. Astfel, a ++ are a— Post-declin
același efect ca
Unii dintre operatorii de atribuire prescurtați utilizați în mod obișnuit sunt prezentați în tabelul următor:
Declarație cu operatorul simplu de atribuire Declarație cu operatorul stenograf
a=a+l a-=1
a=a-l a-=l
a=a*l a*=i
a=a/1 A-1
a=a% 1 a%=l
a=a*(n-l) a*=n+1
5.OPERATORI DE CREȘTERE (++) ȘI DE SCĂDERE (--):
a = a + 1; a--are același efect ca a=a-1.
Diferența dintre a++ și a+1 este că, dacă ++ este după operand, creșterea are loc după evaluarea expresiei.
Operandul dintr-o expresie postfix trebuie să fie o variabilă.
Ex1:
int a=5;
B=a++; Aici valoarea lui B este 5. Valoarea lui A este 6.
Ex2:
int x=4; y=x--; Aici valoarea y este 4, valoarea x este 3
Prefix increment/decrément (++a/ --a)
În incrementul prefixului (decrement), efectul are loc înainte ca expresia care conține operatorul să fie evaluată. Este inversul
operației postfix. ++a are același efect ca a=a+1.
--a are același efect ca a=a-1.
Ex: int b=4;
A = ++b;
În acest caz, valoarea lui b ar fi 5, iar A ar fi 5.
Efectele incrementării atât a postfixului, cât și a prefixului sunt aceleași: variabila este incrementată cu
1. Dar se comportă diferit atunci când sunt folosite în expresii așa cum se arată mai sus. Execuția acestor operatori este
rapidă în comparație cu declarația de atribuire echivalentă.
#include<iostream.h>
int main()
{
int a=1;
int b = 5;
++a;
cout<<"a="<<a<<endl;
--b;
cout<<"b="<<b<<endl;
cout<<"a="<<a++<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b--<<endl;
cout<<"b="<<b<<endl;
returnare 0;
}
a=2
b=4
a=2
a=3
b=4
b=3
6 . OPERATOR CONDIȚIONAL SAU OPERATOR TERNAR:
#include<iostream.h>
vid principal()
{
int a, b, c;
cout<<"Introduceți valorile a și b:";
cin>>a>>b;
c=a>b?a:b;
cout<<"cel mai mare dintre a și b este "<<c;
}
Introduceți valorile a și
b:1 5
7 . OPERATORI BITWISE : C acceptă operatori speciali cunoscuți sub numele de operatori biți pentru
manipularea datelor la nivel de biți. Ele nu sunt aplicate pentru a pluti sau dublu.
operator rost
Explicație: Numărul introdus prin tastatură ca intrare este 8, iar numărul binar corespunzător este 1000.
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
15 14 13 12 11 10 9 876543 21 0
După executarea programului, datele de intrare x trebuie deplasate cu 2 biți în partea dreaptă. Răspunsul în formă
binară ar fi următorul:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
15 14 13 12 11 10 9 876543 21 0
Operatorul schimbătorului din dreapta împarte numărul dat la o putere de 2. Dacă schimbăm un număr binar cu
două locuri spre dreapta, împărțim numărul dat la 4 (2').
Este un operator binar, necesită doi operanzi integrali. Primul operand este valoarea care trebuie deplasată,
iar al doilea operand specifică numărul de biți care trebuie deplasați la stânga.
Când biții se deplasează spre stânga, biții din capătul cel mai din stânga sunt șterși.
NOT la nivel de biți, sau complement, este o operație unară care efectuează negarea logică pe fiecare bit.
formând complementul celor din valoarea binară dată. Cifrele care au fost 0 devin I și invers.
Ex: NU 0111 (zecimal 7) = 1000 (zecimal 8)
În C, t operatorul NOT la nivel de biți este (tildă). Tabel de adevăr:
Valoarea expresiei ~Expresie
0 1
1 (diferit de zero) 0
Notă: Operatorul complementului (Bitwise NOT) este diferit de operatorul logic NOT. Folosim acest operator
în procesul de codificare și decodare.
8.5 OPERATORI PECIALI
Acești operatori care nu se încadrează în niciuna dintre clasificările de mai sus sunt ,(virgulă), dimensiunea,
operatorii Pointer (& și *) și operatorii de selecție membri (. și ->). Operatorul virgulă este utilizat pentru a lega
expresii înrudite.
DIMENSIUNEA operatorului:
Returnează numărul de octeți ocupați de operand. Operandul poate fi o variabilă, o constantă (valoare de date)
sau un calificator de tip de date.
Ex: int a. c, f, d;
c=dimensiunea(a); Aici c = 2, dimensiunea operatorului returnează dimensiunea variabilei a care este de tip
int f = sizeof(dublu lung); valoarea f este 10, care este dimensiunea calificatorului dublu lung de tip d =
sizeof(23.345); Valoarea d este 4 , care este dimensiunea valorii constantei flotante
Dimensiunea operatorului este utilizată în mod normal pentru a determina lungimea matricelor și structurilor.
Este, de asemenea, utilizat pentru a aloca spațiu dinamic variabilei s în timpul executării unui program.
Operatorul virgulă poate fi folosit pentru a lega expresia asociată a expresiilor este evaluată de la stânga la
dreapta și valoarea expresiei combinate.
Ex: a=(x=10, y=20, x+y);
Operatori în c++: Toți operatorii de mai sus ai limbajului c sunt valabili și în c ++. Operatorii noi introduși în c+
+ sunt:
Manipulatoare:
Manipulatorii sunt operatorii utilizați pentru formatarea datelor care urmează să fie afișate pe ecran. Cele
mai frecvent utilizate manipulatoare sunt endl și setw
endl:-este utilizat în declarația de ieșire și inserează o linie de alimentare. Este similar cu noul caracter linie
("\n")
ex: cout<<"a=2"<<endl;
cout<"name=sunil"<<endl;
Ieşire:
a=2
nume=sunil
SETW:-
Acest manipulator permite o lățime specificată pentru un câmp care urmează să fie tipărit pe ecran
și în mod implicit valoarea tipărită este aliniată corect. Această funcție este disponibilă în fișierul antet
iomanip.h
#include<iostream.h>
#include<iomanip.h>
folosind spațiul de nume std;
int main()
{
int s=123;
cout<<"s="<<setw(10)<<s ;
}
Ieşire
s = 123
Operatori de inserție (<<) și extracție (>>):
operatorii sunt utilizați cu obiecte de ieșire și de intrare
ex:
cout<<"Enter n";
cin>>n
1.51 MPLE dacă afirmația: dacă expresia testului este adevărată, atunci dacă instrucțiunea execută afirmații
care urmează imediat dacă
Sintaxă:
If(expresie test)
Lista declarațiilor;
#include<iostream.h>
int main()
{
int a,b;
cout<<"Introduceți oricare două numere întregi:";
cin>>a>>b;
dacă(a>b) cout<<"A este mai mare decât B\n A="<<a;
3 . Cuibărirea afirmațiilor dacă-altceva ESTE,de asemenea, posibil să se cuibărească una dacă afirmația în interiorul
alteia. URMEAZĂsă fie luate o serie de decizii.
Dacă –else instrucțiune plasată în interiorul altei afirmații dacă altceva Sintaxă:
If(expresie test) {If(expresie test) {
//statements } else { //statements } }
else
{If(expresie test) { //declarații } altceva
{ //declarații }
} /*cel mai mare dintre cele trei
numere*/
#include<iostream.h>
#include<conio.h> int main() { int a,b,c;
cout<<"Introduceți valorile a, b, c:";
cin>>a>>b>>c;
dacă(a>b) {
dacă(a>c) {
cout<<"A ia
cel mai mare
dintre trei
numere\n";
cout"A= "<<a;
} altceva {
cout<<"C ia
cel mai mare
dintre trei numere\n"; cout<<"c= "<<c;
} } altceva {if(b>c) {
cout<<"B ia cel mai mare dintre trei numere\n"; cout<<"B="<<b;
}
altfel
{
cout<<"C ia cel mai mare dintre trei numere\n";
cout<<"c="<<c;
}
}
getch();
returnare 0;
}
4.1 f else scară
IF(Condiția1)
declarație1;
altfel dacă(condiție2)
declarația 2;
altfel dacă(condiție3)
declarația n;
altfel
Declarație implicită.
declarația-x;
Condiția este evaluată de sus în jos.dacă o condiție este adevărată, afirmația asociată cu aceasta este executată.
Când toate condițiile devin false, atunci partea finală care conține declarații implicite va fi executată.
#include<iostream.h>
vid principal()
{
int per;
cout<<"Intră
procent"; cin>>per;
dacă(per>=80)
cout<<"Securizat
Distincție"<<sfârșit; altfel dacă(per>=60)
cout<<"Securizat mai întâi
Diviziune"<<endl; altfel dacă(per>=50)
cout<<"Securizat
Divizia a doua"<<endl;
altfel dacă(per>=40)
cout<<"Securizat
Diviziune"<<endl; Treile
altfel a
cout<<"Fail"<<endl
Implicit:
bloc implicit;
1 . ÎN TIMP CE DECLARAȚIA:
face
{
corp
}în timp ce (condiție de testare);
do{
sumă = sumă + i;
i = i + 1;
} în timp ce(i<=n);
cout<<"Suma numerelor naturale first"<< n<<"
este:"<<sumă; returnare 0;
}
Notă: dacă starea testului este falsă. înainte ca bucla să fie executată, atunci În timp ce bucla execută de zero ori unde ca
do - în timp ce execută o singură dată
3.PENTRU BUCLĂ: Este, de asemenea, o buclă de control al intrării care oferă o structură mai
concisă
Sintaxă:
pentru(inițializare; expresie test; increment/descreștere) {
Declaraţii;
}
Pentru că afirmația este împărțită în trei expresii, fiecare este
separată prin punct și virgulă;
1.Expresia de inițiere este utilizată pentru inițializarea
variabilelor
2. Expresia testului este responsabilă de continuarea buclei.
Dacă este adevărat, atunci fluxul de control al programului
intră în buclă și execută blocul de declarații asociate cu
acesta . Dacă expresia testului este falsă, bucla se termină
3.expresia increment/descreștere constă din operator
increment sau descrescător Acest proces continuă până când
condiția testului este îndeplinită.
pentru(i=1;i<=n;i++)
{
sumă = sumă + i;
}
Bucle imbricate:Scrierea unei instrucțiuni de control buclă într-o altă instrucțiune de control buclă se
numește instrucțiune buclă imbricată
Ex:
pentru(i=1;i<=10;i++)
pentru(j=1;j<=10;j++) cout<<i<<j;
cout<<i<<"\t";
}
getch( );
}
Ieşire:
Introduceți numărul: 5
2 35
etichetă:
declarație; eticheta
goto;
Salt înainte Salt înapoi
Eticheta: poate fi oriunde în program, fie înainte, fie după eticheta goto; declarație.
Dacă eticheta: este plasată după eticheta goto;, unele afirmații vor fi omise și saltul este cunoscut sub numele
de salt înainte.
Dacă eticheta: este plasată înaintea etichetei goto; Se va forma o buclă, unele declarații vor fi executate în
mod repetat. Un astfel de salt este cunoscut sub numele de salt înapoi.
Continua:Este folosit pentru a continua iterația declarației buclă sărind peste declarații după
continuarea declarației. Aceasta determină controlul să meargă direct la starea de testare și
apoi să continue bucla.
/*c program pentru a găsi suma a n numere pozitive citite de la tastatură*/
#include<stdio.h>
int main()
{
int i ,suma = 0,n,număr;
cout<<Enter N";
cin>>n;
pentru(i=1;i<=n;i++)
{
cout<<"Introduceți un număr:";
numărul >> cin;
dacă(număr<0) continuă;
sumă = sumă + număr;
}
cout<<"Suma numerelor<<n<<" este:"<<sumă;
returnare 0;
}
UNITATEA -2
Introducerea clasei:
O abordare de programare orientată pe obiecte este o colecție de obiecte și fiecare obiect constă din
structuri și proceduri de date corespunzătoare. Programul este reutilizabil și mai ușor de întreținut.
Aspectul important în oop este o clasă care are o sintaxă similară cu cea a structurii.
clasă: Este o colecție de date și funcții ale membrilor care manipulează datele. Componentele de date ale clasei
se numesc membri de date, iar funcțiile care manipulează datele se numesc funcții membre.
Poate fi numit și plan sau prototip care definește variabilele și funcțiile comune tuturor obiectelor de un
anumit tip. Este, de asemenea, cunoscut sub numele de tip de date definit de utilizator sau ADT (tip de date
abstracte) O clasă este declarată de clasa cuvântului cheie.
Sintaxă:-
clasa class_name {
Specificator acces :
Declarații variabile;
Specificator acces :
declarații de funcții;
};
Control acces:
Specificatorul de acces sau modificatorii de acces sunt etichetele care specifică tipul de acces acordat
membrilor unei clase. Acestea sunt utilizate pentru ascunderea datelor. Acestea sunt, de asemenea, numite
moduri de vizibilitate. Există trei tipuri de specificatori de acces
1. Privat
2. Public
3. Protejat
1. Privat:
Dacă membrii datelor sunt declarați ca acces privat, atunci nu pot fi accesați din alte funcții din afara
clasei. Acesta poate fi accesat numai prin funcțiile declarate în cadrul clasei. Este declarat prin cuvântul cheie
"privat‟ .
2. Public:
Dacă membrii datelor sunt declarați acces public, atunci aceștia pot fi accesați din alte funcții din afara
clasei. Este declarat prin cuvântul-cheie "public".
3. Protejat: Nivelul de acces al declarației protejate se situează între public și privat. Acest specificator de
acces este utilizat în momentul moștenirii
Notă:-
Dacă nu este specificat niciun specificator de acces, atunci acesta este tratat implicit ca privat
Specificatorul implicit de acces al structurii este public în cazul în care cel al unei clase este "privat"
Exemplu:
Elev de clasă
{
privat : int roll;
nume de caractere[30];
public:
nul get_data()
{
cout<<"Introduceți numărul rolei și numele": cin>>roll>>name;
}
nul put_data()
{
cout<<"Numărul rolei:"<<roll<<endl;
cout<<"Nume :"<<nume<<endl;
}
};
Obiect:-Instanța unei clase se numește obiect.
Sintaxă:
class_name object_name;
Ex:
elevii s;
Accesarea operatorului members:-d ot este utilizată pentru a accesa membrii clasei
Object-name.function-name(argumente reale);
Ex:
s.get_data();
s.put_data();
Notă:
1 . Dacă specificatorul de acces nu este specificat în clasă, specificatorul de acces implicit este privat
2 . Toate funcțiile membrilor trebuie declarate publice, dacă nu sunt accesibile în afara clasei. Obiect:
Instanța unei clase se numește obiect.
Sintaxă:
Class_name numele obiectului;
Exemplu:
elevii s;
În exemplul de mai sus s este obiectul. Este o entitate în timp real care poate fi utilizată
Scrieți un program pentru a citi datele unui student
#include<iostream>
folosind spațiul de nume std;
Elev de clasă
{
privat:
int rolă;
numele caracterelor[20];
public:
void getdata()
{cout<<"Introduceți numărul rolei:";
cin>>rolă;
cout<<"Introduceți numele:";
cin>>nume;
}
vid putdata()
{cout<<"Roll no:"<<roll<<endl;
cout<<Nume:"<<nume<<endl;
}
};
int main()
{
elevii s;
s.getdata();
s.putdata();
returm 0;
}
Domeniu de aplicare Operator rezoluție:
Aplicare:-Vizibilitatea sau disponibilitatea unei variabile într-un program se numește domeniu
de aplicare. Există două tipuri de domeniu de aplicare. i)Domeniul de aplicare local
ii)Domeniul de aplicare global
Domeniul de aplicare local: vizibilitatea unei variabile este locală funcției în care este
declarată.
Domeniu de aplicare global: vizibilitatea unei variabile pentru toate funcțiile unui program
Operator de rezoluție a domeniului de aplicare în "::" .
Aceasta este utilizată pentru a accesa variabilele globale dacă aceleași variabile sunt declarate
ca locale și globale
#include<iostream.h>
int a=5;
vid principal()
{
int a=1;
cout<<"Local a="<<a<<endl;
cout<<"Global a="<<::a<<endl;
}
#include <iostream>
folosind spațiul de nume std;
Exemplu de clasă
{
public:
ieșire vidă(); Declarație de funcție
};
definirea funcției în afara
Eșantion de vid de clasă::output() {
cout << "Funcție definită în afara clasei.\n";
};
int main() {
eșantion obj;
obj.ieșire();
returnare 0;
}
Rezultatul programului:
Funcție definită în afara clasei.
Dreptunghi vid::get_data()
{
cout<<"Introduceți lungimea dreptunghiului";
cin>>L;
cout<<"Introduceți lățimea dreptunghiului";
cin>>B;
}
int dreptunghi::area()
{
returnați L * B;
}
int main()
{
dreptunghiul r;
r.get_data();
cout<<"Aria dreptunghiului este"<<r.area();
returnare 0;
}
FUNCȚII INLINE:
Definiție:
O funcție inline este o funcție care este extinsă în linie atunci când este invocată. Extinderea în linie face
ca un program să ruleze mai rapid, deoarece cheltuielile generale ale apelului și returnării unei funcții
sunt eliminate. Acesta este definit prin utilizarea cuvântului cheie " inline"
Sintaxă:
Tip de date numele clasei::static_variable Nume;
Ex: int item::count;
#include<iostream.h>
#include<conio.h>
Element de clasă
{
Număr de inte statice;
numărul int;
public:
void getdata(int a) {
număr=a; număr++;
}
void getcount()
{
cout<<"count is"<<count;
}
};
int item::count;//declerare
int main()
{
lit. a, b, c;
a.getcount();
b.getcount();
c.getcount();
a.getdata(100);
b.getdata(200);
c.getdata(300);
cout<<"După citirea datelor";
a.getcount();
b.getcount();
c.getcount();
returnare 0;
}
Ieşire:
numărul este 0
numărul este 0
numărul este 0
După citirea datelor
numărul este 3
numărul este 3
numărul este 3
Funcții statice ale membrilor
La fel ca variabila statică a membrilor, putem avea și funcții statice ale membrilor. O funcție membru care
este declarată statică are următoarele proprietăți:
O funcție statică poate avea acces numai la alți membri statici (funcții sau variabile) declarați în aceeași
clasă.
O funcție membru static trebuie apelată folosind numele clasei (în locul obiectelor sale) după cum
urmează: class-name :: function-name;
#include<iostream.h>
Test de clasă
{
Codul INT;
Număr de inte statice;
public:
Cod set vid()
{
cod = + + număr;
}
Cod spectacol nul()
{
cout<<"număr obiect"<<cod;
}
Static void showcount()
{
cout<<"count"<<count;
}
};
testul int::count;
int main()
{
încercarea t1,t2;
t1.codul SET();
t2.cod set();
test::showcount();
încercarea t3;
t3.codul SET();
test::showcount();
t1.showcode();
t2.showcode();
t3.showcode();
returnare 0;
}
Ieşire:
Contele 2
Condacul 3
numărul obiectului 1
numărul obiectului 2
numărul obiectului 3
Matrice de obiecte: Matricele de variabile de tip "clasă" sunt cunoscute sub numele de "matrice de obiecte". O
serie de obiecte este stocată în interiorul memoriei în același mod ca într-o matrice obișnuită.
Sintaxă:
Clasa class_name
{
privat:
data_type membri;
public:
data_type membri; funcțiile membrilor;
};
Matrice de obiecte:
Class_name object_name[dimensiune];
Unde dimensiune este dimensiunea matricei
Ex:
Clasa mea obj[10];
Scrieți un program pentru a inițializa matricea de obiecte și a le imprima
#include<iostream>
folosind spațiul de nume std;
clasa MyClass
{
int a;
public:
set vid(int x)
{
a=x;
}
int get()
{
returnarea a;
}
};
int main()
{
MyClass obj[5];
pentru(int i=0;i<5;i++)
obj[i].set(i);
pentru(int i=0;i<5;i++)
cout<<"obj["<<i<<"].get():"<<obj[i].get()<<endl;
}
Ieşire:
obj[0].get():0
obj[1].get():1
obj[2].get():2
obj[3].get():3
obj[4].get():4
a.Pass-by-value – O copie a obiectului (obiect real) este trimisă funcției și atribuită obiectului funcției numite
(obiect formal). Atât copiile reale, cât și cele formale ale obiectelor sunt stocate în diferite locații de memorie.
Prin urmare, modificările făcute în obiectul formal nu sunt reflectate în obiectul real. Scrieți un program pentru
a schimba valorile a două obiecte
Scrieți un program pentru a schimba valorile a două obiecte
#include<iostream.h>
folosind spațiul de nume std;
eșantion de clasă2;
eșantion de clasă1
{
int a;
public:
vid getdata(int x);
afișare vidă prieten(eșantion1 x,eșantion2 y);
prieten void swap (eșantion1 x,eșantion2 y);
};
Void Sample1::GetData(Int X)
{
a=x;
}
Exemplu de clasă2
{
int b;
public:
vid getdata(int x);
afișare vidă prieten(eșantion1 x,eșantion2 y);
};
Void Sample1::GetData(Int X)
{
a=x;
}
Exemplu de clasă2
{
int b;
public:
vid getdata(int x);
afișare vidă prieten(eșantion1 x,eșantion2 y);
prieten void swap(sample1 *x,sample2 *y);
};
Void Sample2::GetData(Int X)
{
b=x;
}
Void Display (eșantion1 x,eșantion2 y)
{
cout<<"Datele din obiectul 1 sunt"<<endl;
cout<<"a="<<x.a<<endl;
cout<<"Datele din obiectul 2 sunt"<<endl;
cout<<"b="<<y.b<<endl;
}
Void swap(eșantion1 *x,eșantion2 *y)
{
int t;
t=x->a;
x->a=y->b;
y->b=t;
}
int main()
{
eșantion1 OBJ1;
eșantion2 OBJ2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Înainte de schimbul de date între două obiecte\n ";
afișaj (obj1,obj2);
swap(&obj1,&obj2);
cout<<"după schimbul de date între două obiecte\n ";
afișaj (obj1,obj2);
}
Înainte de schimbul de date între două obiecte
Datele din obiectul 1 sunt a = 5
Datele din obiectul 2 sunt b = 15
după schimbul de date între două obiecte
Datele din obiectul 1 sunt a = 15
Datele din obiectul 2 sunt b = 5 c.Pass-by-reference:O referință a obiectului este trimisă ca argument pentru a
funcționa.
Referința la o variabilă oferă un nume alternativ pentru variabila definită anterior. Dacă se aduce vreo
modificare variabilei de referință, atunci există o modificare a variabilei inițiale.
O variabilă de referință poate fi declarată după cum urmează:
int x=5;
int &y=x;
Ex:
Scrieți un program pentru a găsi suma a n numere naturale folosind variabila de referință #include<iostream.h>
folosind spațiul de nume std;
int main()
{
int i=0;
int &j=i;
int s=0;
int n;
cout<<"Enter n:";
cin>>n;
în timp ce(j<=n)
{
s=s+i;
I++;
}
cout<<"sum="<<s<<endl;
}
Ieşire:
Introduceți n:10
sumă=55
Scrieți un program pentru a schimba valorile a două obiecte
#include<iostream.h>
folosind spațiul de nume std;
eșantion de clasă2;
eșantion de clasă1
{
int a;
public:
vid getdata(int x);
afișare vidă prieten(eșantion1 x,eșantion2 y);
prieten void swap (eșantion1 &x,eșantion2 & y);
};
Void Sample1::GetData(Int X)
{
a=x;
}
Exemplu de clasă2
{
int b;
public:
vid getdata(int x);
afișare vidă prieten(eșantion1 x,eșantion2 y);
prieten void swap (eșantion1 &x,eșantion2 & y);
};
Void Sample2::GetData(Int X)
{
b=x;
}
Void Display (eșantion1 x,eșantion2 y)
{
cout<<"Datele din obiectul 1 sunt"<<endl;
cout<<"a="<<x.a<<endl;
cout<<"Datele din obiectul 2 sunt"<<endl;
cout<<"b="<<y.b<<endl;
}
Void swap (eșantion1 &x, eșantion2 și y)
{
int t;
t=x.a;
x.a=y.b;
y.b=t;
}
int main()
{
eșantion1 OBJ1;
eșantion2 OBJ2;
obj1.getdata(5);
obj2.getdata(15);
cout<<"Înainte de schimbul de date între două obiecte\n ";
afișaj (obj1,obj2);
swap(OBJ1,OBJ2);
cout<<"după schimbul de date între două obiecte\n ";
afișaj (obj1,obj2);
}
Ieşire:
Înainte de schimbul de date între două obiecte
Datele din obiectul 1 sunt a = 5
Datele din obiectul 2 sunt b = 15
după schimbul de date între două obiecte
Datele din obiectul 1 sunt a = 15
Datele din obiectul 2 sunt b = 5
FUNCȚIILE PRIETENILOR:Membrii privați nu pot fi accesați din afara clasei. adică.... O funcție non-
membră nu poate avea acces la datele private ale unei clase. În C++, o funcție non-membru poate accesa privat,
făcând funcția prietenoasă pentru o clasă.
Definiție:
O funcție prieten este o funcție care este declarată în cadrul unei clase și este definită în afara clasei. Nu
este nevoie de niciun operator de rezoluție a domeniului de aplicare pentru definirea . Poate accesa membrii
privați ai unei clase. Se declară prin utilizarea cuvântului cheie " prieten"
Ex:
Exemplu de clasă
{ int x,y; public: eșantion (int a,int b);
prieten int sum(eșantion s);
};
Eșantion::Eșantion(int a,int b)
{ x=a;y=b;
}
int sum(eșantioane s)
{ int sum;
sum=s.x+s.y;
returnare 0;
}
vid principal()
{
Eșantion obj(2,3);
int res=sum(obj);
cout<< "sum="<<res<<endl;
}
O funcție de prieten posedă anumite caracteristici speciale:
Nu este în sfera clasei căreia i-a fost declarat prieten.
Deoarece nu face parte din domeniul de aplicare al clasei, nu poate fi numit folosind obiectul acelei clase. Poate fi invocată ca o
funcție normală fără ajutorul vreunui obiect.
Spre deosebire de funcțiile membrilor, nu poate accesa direct numele membrilor și trebuie să utilizeze un nume de obiect și un
operator de membru dot cu fiecare nume de membru.
Acesta poate fi declarat fie în partea publică, fie în cea privată a unei clase, fără a-i afecta semnificația.
De obicei, are obiectele ca argumente.
Exemplu de clasă #include<iostream.h>
{
int a;
int b;
public:
valoare setată nulă()
{
a=25;
b=40;
}
media plutitorului prietenului (eșantionul s);
};
Media flotorului (eșantionul S)
{
retur float(s.a+s.b)/2.0;
}
int main()
{
proba X;
X.setvalue();
cout<<"Valoarea medie="<<medie(X);
returnare 0;
}
Scrieți un program pentru a găsi maximum două numere folosind funcția Friend pentru două clase
diferite #include<iostream>
folosind spațiul de nume std;
eșantion de clasă2;
eșantion de clasă1
{
int x;
public:
proba1(int a);
prieten vid max(eșantion1 s1,eșantion2 s2)
};
eșantion1::eșantion1(int a)
{
x=a;
}
Exemplu de clasă2
{
int y;
public:
proba2(int b);
prieten vid max(eșantion1 s1,eșantion2 s2)
};
Eșantion2::eșantion2(int b)
{
y = b;
}
void max(eșantion1 s1,eșantion2 s2)
{
Dacă(s1.x>s2.y)
cout<<"Data member in Object of class sample1 is large "<<endl;
altfel
cout<<"Data member in Object of class sample2 is large "<<endl;
}
vid principal()
{
eșantion1 OBJ1(3);
eșantion2 OBJ2(5);
max(OBJ1,OBJ2);
}
#include<iostream>
folosind spațiul de nume std;
Complex de clasă
{
float real,img;
public:
complex();
complex (float x, float y)
Prieten complex add_complex(complex C1,complex C2);
};
complex::complex()
{
real = img = 0;
}
complex::complex(float x,float y)
{
real=x;img=y;
}
complex add_complex(complex C1,complex C2)
{
complexul t;
t.real=c1.real+c2.real;
t.img=c1.img+c2.img;
returnarea t;
}
Complex vid::d isplay ()
{
if(img<0)
{img=-img;
cout<<real<<"-i"<<img<<endl
} else { cout<<real<<"+i"<<img<<endl
}
}
int main()
{
complexul OBJ1(2,3);
complexul OBJ2(-4,-6);
complex obj3=add_compex(obj1,obj2);
obj3.display();
returnare 0;
}
Clasa prietenilor:O clasă poate fi, de asemenea, declarată a fi prietena unei alte clase. Când creăm o clasă
de prieteni, atunci toate funcțiile membrilor clasei de prieteni devin, de asemenea, prietenii celeilalte clase.
Acest lucru necesită condiția ca prietenul care devine clasă să fie mai întâi declarat sau definit (declarație
înainte).
#include <iostream.h>
Clasa sample_1
{
Clasa de prieteni sample_2;//Clasa de prieteni declaranți
int a,b;
public:
nul getdata_1()
{
cout<<"Introduceți valorile A și B în clasa sample_1";
cin>>a>>b;
}
nul display_1()
{
cout<<"A="<<a<<endl;
cout<<"B="<<b<<endl;
}
};
Clasa sample_2
{
int c,d,sum;
sample_1 obj1;
public:
nul getdata_2()
{
obj1.getdata_1();
cout<<"Introduceți valorile C & D în clasa sample_2"; cin>>c>>d;
}
nul sum_2()
{
sum=obj1.a+obj1.b+c+d;
}
nul display_2()
{
cout<<"A="<<obj1.a<<endl;
cout<<"B="<<obj1.b<<endl;
cout<<"C="<<c<<endl;
cout<<"D="<<d<<endl;
cout<<"SUM="<<sumă<<sfârșit;
}
};
int main()
{
sample_1 s1;
s1.getdata_1();
s1.display_1();
sample_2 s2;
s2.getdata_2();
s2.sum_2();
s2.display_2();
}
întreg obj1; => nu numai că creează obiectul obj1, ci și inițializează membrii săi de date m și n la zero. Nu este
nevoie să scrieți nicio declarație pentru a invoca funcția constructor.
CARACTERISTICILE
CONSTRUCTORULUI
> Ele sunt invocate automat atunci când obiectele sunt create.
> Nu au tip de întoarcere, nici măcar nule.
Ele nu pot fi moștenite, deși o clasă derivată poate numi constructorul clasei de
bază.
> Ca și alte funcții c ++, ele pot avea argumente implicite.
>
Ei fac "apeluri implicite" către operatori noi și șterg atunci când este necesară alocarea memoriei.
Constructorii sunt de 3 tipuri:
1. Constructor implicit
2. Constructor parametrizat
3. Constructor de copiere
1 . Constructor implicit: Un constructor care nu acceptă parametri se numește constructor implicit.
#include<iostream.h>
Element de clasă #include<conio.h>
{
int m,n;
public:
articol()
{
m=10;
n=20;
}
void put();
};
element nul::p ut() {
cout<<m<<n;
}
vid principal()
{
punctul t;
t.put();
getch();
}
2 . Constructori parametrizați:-Constructorii care iau parametri se numesc constructori
parametrizați.
#include<iostream.h>
Element de clasă
{
int m,n;
public:
articol(int x, int y)
{
m = x;
n=y;
}
};
Atunci când un constructor a fost parametrizat, declarația de declarare a obiectului, cum ar fi
punctul t; este posibil să nu funcționeze. Trebuie să transmitem valorile inițiale ca argumente funcției
constructor atunci când este declarat un obiect. Acest lucru se poate face în 2 moduri: articol t = articol
(10,20); apel explicit
m = x;
n=y;
}
void put();
};
element nul::p ut()
{
cout<<m<<n;
}
vid principal()
{
punctul T1(10,20);
punctul t2=articol(20,30);
t1.put();
t2.put();
getch();
}
3 . Copy Builder: Un constructor de copii este utilizat pentru a declara și inițializa un obiect
dintr-un alt obiect.
Exemplu:
punctul T2(T1);
sau
articol t2=t1;
1. Procesul de inițializare printr-un constructor de copii este cunoscut sub numele de inițializare copie.
2. t2=t1 nu va invoca copy constructor. T1 și T2 sunt obiecte, atribuie valorile T1 până la T2.
3. Un constructor de copii face referire la un obiect din aceeași clasă ca și el însuși
un argument. #include<iostream.h>
Exemplu de clasă
{
int n;
public:
eșantion()
{
n=0;
}
Eșantion(Int A)
{
n = a;
}
eșantion (eșantion &x)
{
n=x.n;
}
Afișaj gol()
{
cout<<n;
}
};
vid principal()
{
proba A(100);
proba B(A);
proba C = A;
proba D;
D=A;
A.afișaj();
B.afișaj();
C.afișaj();
D.afișaj();
}
Mai mulți constructori într-o clasă: Mai mulți constructori pot fi declarați într-o clasă. Pot exista
oricâți constructori într-o clasă.
Complex de clasă
{
float real,img;
public:
complex()//constructor implicit
{
real = img = 0;
}
real=img=r;
}
real=r;img=i;
}
complex(complex&c)//copiator constructor
{
real = c.real;
img=c.img;
}
sumă complexă(complex c) {
complexul t;
t.real=real+c.real;
t.img=img+c.img;
returnarea t;
}
spectacol nul()
{
Dacă(img>0)
cout<<real<<"+i"<<img<<endl;
altfel
{
img=-img;
cout<<real<<"-i"<<img<<endl;
}
};
vid principal()
{
complexul C1(1,2);
complexul C2(2,2);
Compex C3;
c3=c1.sum(c3);
c3.spectacol();
DESTRUCTORI:Un distrugător, este folosit pentru a distruge obiectele care au fost create de un constructor.
Ca un constructor, destructorul este o funcție membră al cărei nume este același cu numele clasei, dar
este precedat de o tildă.
De exemplu: ~item() { }
1. Un destructor nu acceptă niciodată niciun argument și nici nu returnează vreo valoare.
2. Acesta va fi invocat implicit de compilator la ieșirea din program pentru a curăța spațiul de stocare care
nu mai este accesibil.
3. Este o bună practică să declarați distrugători într-un program, deoarece eliberează spațiu de memorie
pentru utilizare ulterioară.
#include<iostream>
folosind spațiul de nume std;
Marcaje de clasă
{
public:
int matematică;
int știință;
Constructor
Marks() {
cout << "Inside Constructor"<<endl;
cout << "C++ Object created"<<endl;
}
Destructor
~Marks() {
cout << "Inside Destructor"<<endl;
cout << "C++ Obiect distrus"<<endl;
}
};
int main( )
{
Marcaje m1;
Marcaje m2;
returnare 0;
}
Ieşire:
În interiorul Constructor
C++ Obiect creat
În interiorul Constructor
C++ Obiect creat
În interiorul Destructor
C++ Obiect distrus
În interiorul Destructor
C++ Obiect distrus
MOȘTENIRE: . Mecanismul derivării unei noi clase dintr-una veche se numește moștenire sau derivare.
Vechea clasă este denumită clasă de bază , iar cea nouă se numește clasă derivată sau subclasă. Clasa derivată
moștenește unele sau toate trăsăturile din clasa de bază.
O clasă poate moșteni, de asemenea, proprietăți de la mai multe clase sau de la mai multe niveluri.
Reutilizarea este o caracteristică importantă a OOP
O clasă derivată poate fi definită prin specificarea relației sale cu clasa de bază, pe lângă propriile detalii.
Două puncte indică faptul că numele clasei derivate este derivat din numele clasei de bază. Modul de
vizibilitate este opțional și, dacă există, poate fi privat, protejat sau public. Valoarea implicită este privată.
Modul vizibilitate specifică dacă caracteristicile clasei de bază sunt derivate din surse private sau publice.
Tipuri de moștenire: 1.Moștenire unică 2.Moștenire pe mai multe niveluri 3.Moștenire mutiplecă 4.Moștenire
hibridă 5. Moștenirea ierarhică.
1.MOȘTENIRE UNICĂ: o clasă derivată moștenește dintr-o singură clasă de bază. Este cea mai simplă formă
de moștenire.
Clasa A / /Base
B //Clasa derivată
#include<iostream> folosind spațiul de nume std; clasa A { public: int a,b; void get() { cout<<"Introduceți
oricare două valori întregi"<<endl; cin>>a>>b;
} };
clasa B:public A {
int c;
public:
void add()
{ c=a+b;
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
Bb;
b.get();
b.add();
}
Ieşire:
Introduceți oricare două valori întregi
12
1+2=3
2.MOȘTENIREA PE MAI MULTE NIVELURI: În acest tip de moștenire, clasa derivată moștenește de la o
clasă, care la rândul ei moștenește de la o altă clasă. Super clasa pentru unul, este subclasa pentru celălalt.
#include<iostream.h>
clasa A
{
public:
int a,b;
void get()
{
cout<<"Introduceți oricare două valori întregi"<<endl;
cin>>a>>b;
}
};
clasa B:public A
{
public:
int c;
void add()
{
c=a+b;
}
};
clasa C:public B
{
public:
spectacol nul()
{
cout<<a<<"+"<<b<<"="<<c;
}
};
int main()
{
Cc;
c.get();
c.se adaugă();
c.spectacol();
}
Ieşire:
Introduceți oricare două valori întregi
12 14
12+14=26
3 . Moștenire multiplă: În acest tip de moștenire, o singură clasă derivată poate moșteni de la două sau
mai mult de două clase de bază.
Sintaxă:
clasa D : vizibilitatea A, vizibilitatea B,.... {
#include<iostream.h>
clasa A
{
public:
int a;
vid getA()
{
cout<<"Introduceți o valoare întreagă"<<endl; Cin>>A;
}
};
clasa B
{
public:
int b;
vid getB()
{
cout<<"Introduceți o valoare întreagă"<<endl; cin>>b;
}
};
4 . Moștenire hibridă: Moștenirea hibridă este o combinație de două sau mai multe moșteniri, cum ar fi
moșteniri unice, multiple, pe mai multe niveluri sau ierarhice.
#include<iostream.h>
aritmetica clasei
{
protejat:
int num1, num2;
public:
void getdata()
{
cout<<"Pentru adăugare:";
cout<<"\nIntroduceți primul număr: ";
cin>>num1;
cout<<"\nIntroduceți al doilea număr: ";
cin>>num2;
}
};
clasa plus:aritmetică publică
{
protejat:
int sumă;
public:
void add()
{
sum=num1+num2;
}
};
Clasa minus
{
protejat:
int n1,n2,dif;
public:
void sub()
{
cout<<"\nPentru scădere:";
cout<<"\nIntroduceți primul număr: ";
Cin>>N1;
cout<<"\nIntroduceți al doilea număr: ";
Cin>>N2;
diff=n1-n2;
} };
Rezultatul clasei:Public plus, Public minus
{
public:
Afișaj gol()
{
Pentru completare:
Introduceți primul număr: 1
Pentru scădere:
Introduceți primul număr: 3
Suma dintre 1 și 2= 3
Diferența de 3 și 4= -1
5 . Moștenirea ierarhică: Moștenirea este o metodă de moștenire în care una sau mai multe clase
derivate derivă din clasa de bază comună.
Numar Introducere: 3
Un obiect de date creat în interiorul unui bloc cu nou, va rămâne în existență până când este în mod
explicit
distrus prin utilizarea ștergerii.
operator nou: -
Noul operator poate fi folosit pentru a crea obiecte de orice tip . Prin urmare, noul operator
alocă suficientă memorie pentru a stoca datele obiectelor și returnează adresa memoriei alocate.
Sintaxă:
>
Pentru a crea spațiu de memorie pentru matrice: pointer-variable = tip nou de date[dimensiune];
Operator DElete:
Dacă variabila sau obiectul nu mai este necesar sau este necesar este distrus de operatorul "șterge",
acolo cu o anumită cantitate de memorie este eliberată pentru un scop viitor. Synatx:
ștergeți indicatorul-variabil;
De exemplu: ștergeți p;
>
Dacă dorim să eliberăm o alocare dinamică
array: ștergeți [dimensiune] pointer-variabil;
Program: scrie un program pentru a găsi suma listei de numere întregi #include<iostream> folosind spațiul de
nume std; int main()
{
int n,*p;
cout<<"Introduceți dimensiunea matricei:";
cin>>n;
p=int[n nou];
cout<<"Introduceți lista de numere întregi"<<endl;
pentru(int i=0;i<n;i++)
cin>>p[i];
Logica pentru însumare
int s=0;
pentru( int i=0;i<n;i++)
s=s+p[i];
cout<<"Suma elementelor matricei este\n";
cout<<s;
se elimină [ ]p;
returnare 0;
}
Introduceți dimensiune matrice:5
Introduceți lista de numere întregi
1 2345
Suma elementelor matricei este
15
eșantionul s; obiect
eșantion int ::*p;//pointer: declerare
s.*p=10; corect
cout<<s.*p;
}
Indicatori către obiecte:Indicatorii către obiecte sunt utili pentru crearea obiectelor în timpul rulării. Pentru a
accesa operatorul săgeată membri ( ) și operatorul de referențiere sau indirecția (*).
Declarația indicatorului.
className*ptr
ex:
articol *obj;
Aici obj este un indicator către obiectul elementului tip.
Element de clasă
{
Codul INT;
preț flotant;
public:
vid getdata(int a,float b)
{
cod=a;
preț = b;
}
spectacol nul()
{
cout<<"code:"<<code<<"\n"<<"Price:"<<price<<endl;
}
};
b)utilizarea indicatorului
ptr->getdata(101,77.7);
ptr->spectacol();
c)Utilizarea operatorului de referențiere și a operatorului de puncte (*ptr).getdata(101,77.7);
(*ptr).show();
Declarația de mai sus creează spațiu de memorie pentru o matrice de 10 obiecte de tip element.
Indicatori către clasele derivate: Indicatorii pot fi declarați clasei derivate. Poate fi folosit pentru a
accesa membrii clasei de bază și ai clasei derivate. Un pointer de clasă de bază poate fi, de asemenea, utilizat
pentru a indica obiectul clasei derivate, dar poate accesa numai membrii care sunt moșteniți de la clasa de
bază.
#include<iostream.h>
Baza clasei
{
public:
int a;
Void get_a(Int X)
{
a=x;
}
nul display_a()
{
cout<<"In base"<<"\n"<<"a="<<a<<endl;
}
};
clasă derivată:bază publică
{
int b;
public:
vid get_ab(int x,int y)
{
a=x;
b=y;
}
nul display_ab()
{
cout<<"În derivat "<<"\n"<<"a="<<a<<"\nb="<<b<<endl;
}
};
int main()
{
baza b;
baza *bptr;
bptr=&b;//indică obiectul clasei de bază
BPTR->get_a(100);
BPTR->display_a();
derivată d;
derivat *dptr;
dptr=&d;//indică obiectul clasei derivate
DPTR->get_a(400);
DPTR->display_a();
DPTR->get_ab (300.200);
DPTR->display_ab();
returnare 0;
}
Ieşire:
În bază
a=100
În bază
a=400
În derivat
a=300
b=200
În bază
a=400
Polimorfismul se referă la proprietatea prin care obiectele aparținând unor clase diferite sunt capabile
să răspundă la același mesaj, dar forme diferite. O cerință esențială a polimorfismului este, prin urmare,
capacitatea de a se referi la obiecte fără a ține cont de clasele lor.
Când folosim același nume de funcție atât în clasele de bază, cât și în cele derivate, funcția din clasa
bas este declarată virtuală folosind cuvântul cheie virtual care precede declarația sa normală.
Când o funcție devine virtuală, C++ determină ce funcție să utilizeze în timpul rulării pe baza tipului de obiect
indicat de indicatorul de bază, mai degrabă decât a tipului indicatorului. Astfel, făcând indicatorul de bază să
indice diferite obiecte, putem executa diferite versiuni ale funcției virtuale.
#include<iostream.h>
clasa de bază
{
public:
Afișaj gol()
{
cout<<"Baza de afișare";
}
Spectacol vid virtual ()
{
cout<<"Arată baza";
}
};
clasa Derivat : baza publică
{
public:
Afișaj gol()
{
cout<<"Display Derived";
}
spectacol nul()
{
cout<<"spectacol derivat";
}
};
vid principal()
{
Baza b;
derivat d;
Baza *ptr;
cout<<"ptr indică la bază";
ptr=&b;
ptr->display(); apeluri de bază
ptr->spectacol(); / /Baza de apeluri
cout<<"PTR indică derivat";
ptr=&d;
ptr->display(); apeluri de bază
ptr->spectacol(); clasa Derivat
}
Ieşire:
Baza de afișare
Arată derivat
Când ptr este făcut pentru a indica obiectul d, afirmația ptr->display(); apelează numai funcția
asociate cu Baza, adică Baza::d isplay()
ptr->spectacol();
apelează versiunea derivată a show(). Acest lucru se datorează faptului că afișarea funcției () nu a fost făcută
virtuală în clasa de bază.
Când sunt create funcții virtuale pentru implementarea legării târzii, respectați câteva reguli de bază
care satisfac cerințele compilatorului.
SUPRAÎNCĂRCAREA OPERATORULUI
C++ are capacitatea de a oferi operatorilor o semnificație specială pentru un tip de date. Mecanismul de a da
astfel de semnificații speciale unui operator este cunoscut sub numele de supraîncărcare a operatorului.
Putem supraîncărca toți operatorii, cu excepția următoarelor:
Operator de acces membru al clasei ("." Și "
.*") Operatorul rezoluției domeniului de aplicare ": :"
Operator dimensiune (dimensiune)
Operator condiționat
Pentru a defini o sarcină suplimentară pentru un operator, specificați ce înseamnă în raport cu clasa la
care se aplică operatorul. Acest lucru se face cu ajutorul unei funcții speciale, numită funcție operator.
Procesul de supraîncărcare implică următorii pași:
1. Creați o clasă care definește tipul de date care urmează să fie utilizat în operațiunea de
supraîncărcare.
2. Declarați operatorul funcției operator op() în partea publică a clasei. Poate fi o funcție de membru
sau o funcție de prieten.
3. Aici op este operatorul care trebuie supraîncărcat.
4. Definiți funcția operatorului pentru a implementa operațiunile necesare.
Ex:
complex complex::operator+(complex c)
{
complexul t;
t.real=real+c.real;
t.img=img+c.img;
returnarea t;
}
Conceptul de supraîncărcare a operatorului
Una dintre caracteristicile unice ale C++ este supraîncărcarea operatorului. Aplicarea supraîncărcării
operatorilor înseamnă ca același operator să răspundă diferit. De exemplu, operatorul + poate fi utilizat ca
operator concatenat, precum și ca operator suplimentar.
1. Funcția operatorului trebuie să fie fie funcția membru, fie funcția prieten.
2. Dacă funcția operator este o funcție prietenă, atunci va avea un argument pentru operatorul unar
& două argumente pentru operatorul binar
3. Dacă funcția operator este o funcție membru, atunci va avea argumentul zero pentru operatorul
unar și un argument pentru operatorul binar
Ex:
void operator-()
{
real = -real;
img=-img;
}
Sintaxă pentru operator unar (în afara unei clase)
return-type classname::operator operatorsymbol( )
{
Corpul funcției
}
Exemplul 1: -
Operator de vid++()
{
contra++;
}
Exemplul 2: -
Complex vid::operator-()
{
real = -real;
img=-img;
}
public:
fapt ()
{
a=0;
} fapt (int i) {
a=i;
}
Operator de fapt! ()
{
int f=1,i;
faptul t;
pentru (i=1;i<=a;i++)
{
f=f*i;
}
t.a=f;
returnarea t;
}
Afișaj gol()
{
cout<<"Factorialul "<< a;
}
};
vid principal()
{
int x;
cout<<"introduceți un număr";
cin>>x;
faptul s(x),p;
p=!s;
p.afișaj();
}
Explicație:
Am luat "!‟ ca operator la supraîncărcare. Aici numele clasei este fapt. Constructor fără parametri pentru a lua
valoarea inițială a lui "x‟ ca 0. Constructor cu parametru pentru a lua valoarea "x ‟ . Am creat două obiecte,
unul pentru a face factorialul și celălalt pentru a returna factorialul. Aici numărul de parametri pentru o funcție
supraîncărcată este 0. Factorial este operator unar deoarece operează pe un singur element de date.
Supraîncărcarea operatorului găsește factorialul obiectului. Funcția de afișare pentru imprimarea rezultatului.
Exemplul 1: -
Scrieți un program pentru a supraîncărca operatorul unar -
#include<iostream>
folosind spațiul de nume std;
Complex de clasă
{
float real,img;
public:
complex();
complex (float x, float y);
afișaj vid();
operator nul-();
};
complex::complex()
{
real=0;img=0;
}
complex::complex(float x, float y)
{
real = x;
img=y;
}
Complex vid::d isplay()
{
int imag=img;
if(img<0)
{
imag=-img;
cout<<real<<" -i"<<imag<<endl;
}
altfel
cout<<real<<" +i"<<img<<endl;
}
Complex vid::operator-()
{
real = -real;
img=-img;
}
int main()
{
complexul C(1,-2);
c.afișaj();
cout<<"După unar - operație\n";
-c;
c.afișaj();
}
Exemplul 2: -
#include<iostream.h>
folosind spațiul de nume std;
Spațiu de clasă
{
int x,y,z;
public:
void getdata(int a,int b,int c);
afișaj vid();
operator nul-();
};
spațiu gol :: getdata(int a,int b,int c)
{
x=a;
y = b;
z=c;
}
spatiu gol :: display()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
}
spațiu gol :: operator-()
{
x=-x;
y=-y;
z=-z;
}
int main()
{
spațiul s;
s.getdata(10,-20,30);
s.afișaj();
-s;
cout<<"după negare\n";
s.afișaj();
}
Ieşire:
x=10
y=-20
z=30
după negare
x=-10
y=20
z=-30
Este posibil să supraîncărcați un operator minus unar folosind o funcție de prieten după cum urmează:
prieten void operator-(spațiu &s);
Exemplul 3: -
Operator minus unar folosind o funcție prieten
#include<iostream.h>
#include<iostream.h>
folosind spațiul de nume std;
Spațiu de clasă
{
int x,y,z;
public:
void getdata(int a,int b,int c);
afișaj vid();
prieten operator vid-(spațiu &);
};
spațiu gol :: getdata(int a,int b,int c)
{
x=a;
y = b;
z=c;
}
int main()
{
spațiul S;
S.getdata(10,-20,30);
S.afișaj();
-S;
cout<<"după negare\n";
S.afișaj();
}
Ieşire:
10 -20 30
după negare
-10 20-30
Sintaxă pentru operator binar (în interiorul unei clase) operator de tip returnare
operatorsymbol(argument) {
Corpul funcției
}
Sintaxă pentru definiția operatorului binar (În afara unei clase ) tip return-type classname::operator
operatorsymbol(argument) {
Corpul funcției
}
Scrieți un program pentru a supraîncărca operatorii aritmetici pe numere complexe folosind funcția
membru
#include<iostream.h>
Complex de clasă
{
float real,img;
public:
complex(){ }
Complex (Float X, Float Y)
{
real = x;
img=y;
}
operator complex+(complex c) void display();
};
complex complex::operator+(complex c)
{
temperatură complexă;
temp.real=real+c.real;
temp.img=img+c.img;
temperatura de întoarcere;
}
Complex vid::d isplay()
{
int imag=img;
Dacă(img<0)
{
imag=-imag;
cout<<real<<"-i"<<imag;
} altceva cout<<real<<"+i"<<img;
}
int main()
{
complexul C1,C2,C3;
c1=complex(2,5,3,5);
c2=complex(1,6,2,7);
c3=c1+c2;
c3.display();
returnare 0;
}
Supraîncărcarea operatorilor binari folosind prietenii
1. Înlocuiți declarația funcției membru cu declarația funcției prieten în clasa friend complex operator+
(complex, complex)
2. Redefiniți funcția operatorului după cum urmează:
Operator complex+(Complex A, Complex B)
{
complex de retur ((a.x+b.x),(a.y+b.y));
}
Scrieți un program pentru a supraîncărca operatorii aritmetici pe numere complexe folosind funcția
prieten #include<iostream.h>
Complex de clasă
{
float real,img;
public:
complex(){ }
Complex (Float X, Float Y)
{
real = x;
img=y;
}
prieten operator complex+(complex);
afișaj vid();
};
Operator complex+(Complex C1, Complex C2)
{
temperatură complexă;
temp.real=c1.real+c2.real;
temp.img=c1.img+c2.img;
temperatura de întoarcere;
}
Complex vid::d isplay()
{
Dacă(img<0)
{
img=-img;
cout<<real<<"-i"<<img;
}
altfel
cout<<real<<"+i"<<img;
}
int main()
{
complexul C1,C2,C3;
c1=complex(2,5,3,5);
c2=complex(1,6,2,7);
c3=c1+c2;
c3.display();
returnare 0;
}
UNITATEA -5
Conceptul de șabloane
Introducere
În loc să scriem funcții diferite pentru diferitele tipuri de date, putem defini comune
funcționa. De exemplu
int max(int a,int b); Returnează maximum două numere întregi float
max(plutitor a, plutitor b); Returnează maximum două flotoare char max(char a,char b); Returnează maximum
două caractere (acest lucru se numește supraîncărcare funcție)
Dar, în loc să scrie trei funcții diferite ca mai sus, C ++ a oferit facilitatea numită "Șabloane". Cu ajutorul
șabloanelor puteți defini o singură funcție comună, după cum urmează:
Funcțiile șablon sunt modalitatea de a face rezumate de funcții / clase prin crearea comportamentului funcției
fără a ști ce date vor fi gestionate de o funcție. Într-un sens, aceasta este ceea ce este cunoscut sub numele de
"funcții generice sau programare".
Funcția șablon se concentrează mai mult pe gândirea algoritmică decât pe un mijloc specific al unui singur tip
de date. De exemplu, puteți crea o funcție push de stivă șablonată. Această funcție push poate gestiona
operația de inserare într-o stivă pe orice tip de date, mai degrabă decât să creeze o funcție de împingere a stivei
pentru fiecare tip diferit.
Sintaxă:
Șablon < tipul clasei >
ret_type fun_name(lista parametrilor)
{
--------------Corpul funcției
} //www.suhritsolutions.com
Caracteristicile șabloanelor: -
1. Elimină codul redundant
2. Îmbunătățește reutilizarea codului.
3. Oferă o mare flexibilitate limbajului
Șabloanele sunt clasificate în două tipuri. Sînt
1 . Șabloane de funcții
2 . Șabloane de clasă.
Șabloane de funcții
Șabloanele declarate pentru funcții sunt denumite șabloane de funcții. Un șablon de funcții definește modul în
care poate fi construită o funcție individuală.
Sintaxă:
șablon < tip de clasă,......... >
ret _type fun_ nume(argumente)
{
-----------------Corpul funcției
-----------------
}
ȘABLOANE DE CLASĂ
Șabloanele declarate pentru clase se numesc șabloane de clasă. Un șablon de clasă specifică modul în
care clasele individuale pot fi construite similar cu specificația normală a clasei. Aceste clase modelează o
clasă generică care acceptă operații similare pentru diferite tipuri de date. Forma generală a unui șablon de
clasă
…; ….
}
O clasă creată dintr-un șablon de clasă se numește clasă șablon. Sintaxa pentru definirea unui obiect dintr-o
clasă de șabloane este:
classname<type> objectname(arglist);
#include<iostream.h>
#include<conio.h>
șablon <clasa T> schimb de clasă
{
T a,b;
public:
swap (T x,T y)
{
a=x;
b=y;
}
swapab nul()
{
Temperatura T;
temp=a;
a=b;
b = temp;
}
void showdata()
{
cout<<a<<b;
}
};
vid principal()
{
int m,n;
plutitor m1,n1;
cout<<"Introduceți valori întregi";
cin>>m>>n;
cout<<"Introduceți valori flotante";
cin>>m1>>n1;
swap<int> c1(m,n);
swap<float> c2(m1,n1);
c1.swapab();
c1.showdata();
c2.swapab();
c2.showdata();
}
Sintaxă:
Test(T1 x,T2 y)
{ a = x; b = y;
}
spectacol nul()
{
cout<<a<<b;
}
};
vid principal()
{
test < flotant, int> test1 (1,23,123);
test<int,char> test2(100,'w‟);
test1.show();
test2.show();
}
ȘABLOANE DE FUNCȚII
La fel ca șablonul de clasă, putem defini, de asemenea, șabloane de funcții care ar fi utilizate pentru a crea o
familie de funcții cu diferite tipuri de argumente.
Formular general:
șablon <clasa T>
return-type function-name (argumente de tip T)
{}
#include<iostream.h>
șablon<clasa T>
swap vid (T &x, T &y)
{
T temp = x;
x=y;
y=temp;
}
distracție vidă (int m, int n, float a, float b)
{
cout<<m<<n;
swap(m,n);
cout<<m<<n;
cout<<a<<b;
swap (a, b);
cout<<a<<b;
}
int main()
{
distracție(100.200,11.22,33,44);
returnare 0;
}
Exemplul 2: -
#include < iostream.h >
#include < conio.h >
șablon
T max(T a, T b)
{
dacă(a>b)
returnarea a;
altfel
returnarea b;
}
vid principal( )
{
char ch1,ch2,ch3;
cout<<"introduceți două caractere"<< ch2<< ch3;
cin>>CH2>>CH3;
d=max(CH2,CH3);
cout<<"max(ch2,ch3)"<< ch1;
int a,b,c;
cout<<"introduceți două numere întregi:";
cin>>a>>b;
c=max(a,b);
cout<<"max(a,b):"<< c<< endl;
flotor f1,f2,f3;
cout<<"introduceți două flotoare< F1F2 >:";
cin>>f1,f2;
f3=max(f1,f2);
cout<<"max(f1,f2):"<< f3;
}
Ieşire:
introduceți două caractere: A,B
max(ch2,ch3):B
Introduceți două numere întregi:20,10
max (a,b) :20
Introduceți două flotante: 20.5,30.9
Max (F1,F2) :30.9
#include<iostream.h>
#inlcude<șir.h>
template<clas T1, clasa T2> void display(T1 x,T2 y) {
cout<<x<<y;
}
int main()
{
afișaj (1999,"EBG");
afișaj (12.34,1234);
returnare 0;
}
Tratarea excepțiilor
Excepții: Excepțiile sunt anomalii de execuție sau condiții neobișnuite pe care un program le poate întâlni în
timpul executării . Anomaliile pot include condiții precum împărțirea fundului la zero, accesarea unei matrice
în afara limitelor sale sau epuizarea memoriei sau a spațiului pe disc. Atunci când un program îndeplinește o
condiție de excepție, acesta trebuie identificat și tratat.
Excepțiile oferă o modalitate de a transfera controlul dintr-o parte a unui program în alta. Gestionarea
excepțiilor C ++ se bazează pe trei cuvinte cheie: încercați, prindeți și aruncați.
1.Excepții sincrone:Erori precum "Index în afara intervalului" și "supraflux" sunt excepții sincrone
2. Excepții asincrone: Erorile generate de orice eveniment dincolo de controlul programului se numesc
excepții asincrone
Scopul tratării excepțiilor este de a oferi un mijloc de detectare și raportare a unei circumstanțe excepționale
cout<<"Result(a/x)="<<a/x<<endl;
}
altfel
{ aruncă x;
}
}
captură(int ex)
{
cout<<"Excepție prinsă:Divide By Zero \n";
}
}
MECANISM DE ARUNCARE
Când este detectată o excepție, aceasta poate fi aruncată utilizând instrucțiunea aruncare în oricare dintre
următoarele forme
aruncare(excepție); aruncă excepție;
arunca;
MECANISMUL DE CAPTURARE:
• Atunci când se aruncă o excepție, se caută rutina de tratare a excepțiilor pentru o potrivire adecvată.
• Este posibil ca argumentele mai multor declarații de captură să corespundă tipului unei excepții. În
astfel de cazuri, se execută primul handler care se potrivește tipului de excepție
cout<<"caught a double"<<endl;
}
}
int main()
{
încercare(1);
încercare(0);
încercare(-1);
încercare(2);
returnare 0;
}
Ieşire:
a prins un număr întreg
a prins un personaj
a prins o dublă
Sfârșitul blocului de încercare
toate tipurile posibile de excepții și, prin urmare, este posibil să nu fie în măsură să conceapă manipulatori
independenți de capturi pentru a le captura. În astfel de circumstanțe, putem forța o declarație de captură să
cuprindă toate excepțiile în loc de un anumit tip.
captură(...)
{}
returnare 0;
}
Este posibil să se transmită din nou excepția capturată de un bloc de captură unui alt manipulator de
excepții. Acest lucru l-am cunoscut sub numele de Re-aruncare.
#include <iostream>
folosind spațiul de nume std;
vid MyHandler()
{ încercați {
arunca "salut";
}
captură (const char*)
{
cout <<"Excepție prinsă în MyHandler\n";
arunca; rearuncare char* din funcție
}
}
int main()
{ cout<< "Start principal "<<sfârșit; încerca
{
MyHandler();
}
captură(const char*)
{
cout <<"Excepție prinsă în interiorul Main\n";
}
cout << "Capătul principal";
returnare 0;
}
Specificarea excepțiilor:
Specificarea funcțiilor de restricționare a excepțiilor pentru a arunca unele excepții specificate numai cu
utilizarea throw(lista de excepții) în antetul funcției.
Formă generală
Tastați function_name(listă de argumente) aruncare(excepții -listă)
{
Declaraţii
încercați {
Declaraţii
}
#include <iostream>
folosind spațiul de nume std;
test vid (int x) aruncare (int, float, char)
{
comutator(x)
{
cazul 1:aruncarea X;
sparge;
cazul 2:aruncă "x";
sparge;
cazul 3: aruncare dublă (x);
sparge;
cazul 4:aruncare plutitoare(x);
sparge;
}
}
int main()
{
încerca
{
testul(4);//testul(4) duce la terminarea anormală
}
captură(int i)
{
cout <<"Excepție de tip int prins\n";
}
captură (plutitor F)
{
cout <<"Excepție de tip flotor prins\n";
}
captură (char c)
{
cout <<"Excepție de tip char prins\n";
}
Captură (dublu I)
{
cout <<"Excepție de tip dublu prins\n";
}
returnare 0;
}