Curs C++ | Sectiunea 14 – Structuri
Inainte de a spune orice despre structuri, sa vorbim putin despre un nou tip de date si anume, string. Vom povesti doar putin cat sa intelegem despre ce este vorba, vom detalia ulterior intr-o sectiune separata.
💡 Variabilele de tip string pot stoca siruri de caractere (destul de evident 🙂 ). Asta ar fi diferenta fundamentala fata de tipul char invatat pana acum, unde puteam stoca un singur caracter.
Asignarea valorilor se face ca si pana acum:
❗ Pentru a putea folosi un string, trebuie sa includeti libraria #include <string>.
Vom reveni mult mai in detaliu despre aceste siruri de caractere, pentru moment insa este suficient asa ca vom continua cu structurile.
Structuri
💡 O structura este un nou tip de date al carei elemente pot fi de tipuri diferite. Poate contine orice numar de elemente de orice tip. Fiecare element este denumit camp(field). Fiecare camp este identifica dupa nume, nu dupa index (ca in cazul vectorilor). Bineinteles, numele trebuie sa fie unic si nu poate fi duplicat in interiorul structurii.
Sa analizam putin exemplul:
- declararea unei structuri incepe mereu prin keyword-ul struct
- urmeaza numele structurii (LIBRARY in cazul nostru)
- prin deschiderea acoladei marcam inceperea definirii campurilor
- structura din exemplu are 3 campuri (un string, un bool si un int)
- declararea se termina cu inchiderea acoladei
❗ Atentie, declararea de mai sus si declararea unei structuri in general nu creaza o variabila, doar descrie structura ce urmeaza a fi folosita in program. Pentru a declara o variabile de acest tip avem urmatoarele variante:
Setam doua variabile de tip struct LIBRARY (este suficient sa scriem si doar LIBRARY) numite lib si lib2. Stim ca o astfel de structura contine 3 campuri deci se pune problema accesarii acestora.
💡 Cum C++ ne pune la dispozitie operatorul de indexare [ ] pentru siruri, ne ofera si asa numitul operator de selectie (selection operator) special pentru structuri, fiind reprezentat prin caracterul punct “.” .
Este un operator binar astfel ca argumentul din stanga trebuie sa identifice o structura iar cel din dreapta trebuie sa fie numele unui camp din structura. Expresia ce contine acest operator uneori poarta numele si de selector.
Siruri de structuri
💡 Din punct de vedere virtual, orice tip de date poate fi folosit ca si camp al unei structuri: scalari (incluzand pointeri), siruri si aproape toate structurile. Spunem aproape pentru ca o structura nu poate fi un camp propriu ei.
Asa cum am spus, putem avea un vector cu orice tip de date asa ca o structura nu este cu nimic diferita in acest caz.
Accesarea campului dorit necesita doua operatii consecutive:
- primul pas consta in folosirea operatorului de indexare al sirului [ ] pentru a accesa structura dorita
- al doilea pas presupunse folosirea operatorului de selectie pentru a selecta campul dorit
Declararea unei structuri
Vom lua o structura mai simpla pentru a prezenta urmatoarele afirmatii. Avem 3 campuri de tip int, cu un nume reprezentativ pentru rolul pe care il au.
Este la fel de valabila si urmatoarea declarare, cele doua variante fiind echivalente.
❗ Aceste declarari nu creaza nicio variabila, doar anunta compilatorul despre noul nostru tip de date. Exista totusi un mod de a declara o structura si a declara si variabilele in acelasi timp.
Putem sa si omitem numele structurii. In acest caz insa, nu vom mai putea determina tipul acelei variabile si acest lucru poate deveni problematic (ex: folosirea operatorului sizeof).
💡 Mai mult, o structura poate fi in interiorul altei structuri. Sa presupunem ca vrem sa extindem structura noastra LIBRARY. Vom adauga un nou camp de tip CALENDAR. Acest lucru va insemna ca vom fi nevoiti sa folosim doi operatori de selectie consecutivi pentru a accesa campurile din a doua structura.
Tips and tricks
🤖 Este permis ca numele unei structuri sa fie identic cu numele unui camp din interior acesteia. Nu este recomandat insa deoarece poate duce la erori de citire si scriere.
🤖 Doua structuri pot contine acelasi camp cu acelasi tip si nume, deoarece fac parte din structuri diferite. Spre exemplu:
🤖 Structurile pot fi initializate in momentul declararii. Procedeul este cel invatat la siruri si vectori, folosind acolade iar in interior punand valorile corespunzatoare. Trebuie sa fim atenti ca valorile din lista sa fie de tipurile corespunzatoare din structura.
Bineinteles, daca initiatorul contine mai putine elemente, compilatorul va presupune ca restul vor avea valoarea zero.
Aici se termina si aceasa sectiune 🙂 . Pentru mai multe intrebari, puteti folosi informatiile de aici.
➡ Sectiunea anterioara:Curs C++ | Sectiunea 13 – Siruri de siruri
➡ Sectiunea urmatoare:Curs C++ | Sectiunea 15 – Pointeri

