P-Programowanie

Struktury C++

Ostatania modyfikacja: 28 września 2017, kategoria: C++

Struktury to złożone typy danych pozwalające przechowywać różne informacje. Za pomocą struktur możliwe jest grupowanie wielu zmiennych o różnych typach w jeden obiekt. Strukturę można nazywać obiektem lub pojemnikiem czy też rekordem. Dzięki strukturom można w prosty sposób organizować zbiory danych, bez konieczności korzystania z tablic (np. bardzo niewygodnie tworzyć bazę danych na tablicach).

Deklaracja struktury w C++

Utworzę przykładową strukturę reprezentującą osobę. Dzięki utworzeniu takiej struktury, będzie można przechowywać informacje takie jak imię, nazwisko i wiek w jednym pojemniku.

Słowo kluczowe struct informuje kompilator, że zostanie zadeklarowana struktura. Na drugim miejscu znajduje się nazwa struktury. Następnie w klamerkach występują kolejno po sobie pola struktury czyli zmienne.

W powyższym przykładzie, oprócz deklaracji struktury zostały także utworzone jej obiekty. Nazwy nowych obiektów struktury wypisuje się po przecinku po bloku z polami.

Do struktury można dołączyć także funkcje jednak nie jest to dobry zabieg. Struktury w C mogły zawierać tylko pola. W C++ wprowadzono także możliwość dołączania metod do struktury czyli funkcji.

Metoda – to inaczej funkcja w strukturze
Pole – to inaczej zmienna w strukturze

Struktura w C++ działa na takiej samej zasadzie jak klasa, to właśnie klasa powinna organizować różne metody oraz pola. Używając struktur w naszym programie, chcąc poszerzyć ją o metody, warto rozważyć po prostu użycie klas.

W internecie często będziesz spotykał nieco inną deklarację struktury z użyciem rozkazu typedef. Przykład takiej deklaracji to np:

Taka forma deklaracji była używana w języku C. W języku C deklarując strukturę trzeba było za każdym razem jej typ poprzedzać słowem struct nawet w głównej funkcji programu. Dlatego programiści tworzyli typ złożony za pomocą rozkazu typedef. Dzięki temu zamiast pisać za każdym razem struct osoba ktos, można było używać struktur tak jak w teraz w C++ czyli osoba ktos.

Wczytywanie danych do struktury

Posiadamy zadeklarowaną strukturę osoba. Wykorzystajmy ją w programie. Na początku utworzymy obiekt struktury, następnie wypełnimy danymi i wyświetlimy dowolne pole:

Jest to prosty przykład na to, jak działa wypełnianie struktur danymi. Zauważ, że chcąc korzystać ze zmiennych struktury odwołujemy się do nich najpierw podając nazwę obiektu struktury, następnie nazwę pola po kropce. Mamy dostęp do wszystkich pól struktury, bo domyślnie są mają one atrybut public.

Warto dodać, że jest to właśnie jedna z różnic pomiędzy strukturą a klasą. Klasa domyślnie posiada atrybut private na wszystkie swoje metody i pola.

Tablica struktur

Tablica struktur doskonale sprawdza się podczas tworzenia prostych programów bazodanowych. Bez korzystania ze struktur trzeba było by użyć tablicy dwuwymiarowej, pierwszy wymiar odpowiadał by indeksie osoby, a drugi zawierał by odpowiednie informacje o niej. Oczywiście tablica posiada wszystkie elementy jednego typu co jest nie wygodne.

Tak samo jak tworzy się tablice z typów podstawowych, tak samo robi się to używając struktur:

 

Struktury dynamiczne

Struktury w C++ często są tworzone w sposób dynamiczny, czyli przy użyciu wskaźników. Należy pamiętać aby zawsze zwalniać pamięć po nie używanych obiektach, które utworzyliśmy.

Uwaga! W strukturze statycznej odwołując się do pól używaliśmy kropki (.). W strukturze dynamicznej odwołując się do pól korzystamy z operatora strzałki (->).

Poniższy przykład demonstruje inicjację struktury, użycie operatora ->, oraz zwolnienie pamięci:

 

Operator -> ułatwia nam sprawę. Zauważ, że nazwa zmiennej strukturalnej jest wskaźnikiem. Chcąc posłużyć się kropką tak jak przy strukturze statycznej, musiało by wyglądać to tak:

Użytkownik Paulina napisał:

25 lutego 2013


Artykuł przydał się w przygotowaniach do kolosa. Dzięki. ;]

Użytkownik Alex napisał:

09 września 2013


Jeżeli mówisz o strukturach w C++ to warto powiedzieć także o klasach bo to prawie to samo…

Użytkownik ił-2 napisał:

02 kwietnia 2015


dlaczego jak używam wskaźnika do struktury to niby kompiluje, ale jak włączam to wyskakuje raport o błędach i wyłącza program?

Użytkownik Ma napisał:

10 stycznia 2016


Dzięki za świetny materiał do powtórki

Użytkownik Ola napisał:

17 stycznia 2016


Dziękuję Ci bardzo, przydało mi się :)

Użytkownik Kasia napisał:

22 stycznia 2016


Cześć Karol, strona pełna wiedzy. Dziękuje za twój czas i poświecenie :)

Użytkownik Karol napisał:

24 listopada 2016


Witaj, dobrze opisane. Natomiast pytanie: czy mógłbyś mi napisać jak zrobić coś takiego, żeby rozszerzyć istniejącą tablicę? Chodzi o to, że mam dynamicznie alokowaną pamięć na tablicę obiektów tworzoną w osobnej funkcji (w mainie mam tylko interface użytkownika: menu z użyciem switch’a) a muszę dodać możliwość rozszerzenia tej tablicy obiektów o ilość obiektów jaką chce użytkownik. Tak samo z tablicą wskaźników. Jak to zrobić i jak potem prawidłowo usuwać zaalokowaną pamięć?

Użytkownik Karol napisał:

24 listopada 2016


@Karol
Cześć, jedyną metodą jest utworzenie nowej tablicy o większym rozmiarze i przekopiowanie do niej elementów ze starej tablicy. Innym rozwiązaniem byłoby skorzystanie z jakiegoś kontenera, który umożliwia dynamiczne dodawanie nowych elementów np. std::Vector. Trochę przypomina on tablicę. Poszerzanie tablicy jest niemożliwe, ponieważ znając jej rozmiar kompilator rezerwuje na nią daną ilość miejsca w pamięci. Zaraz za tablicą może znajdować się już inna zmienna, która została by nadpisana rozszerzając tablicę.

Użytkownik Krzysztof napisał:

29 marca 2018


Witaj Karolu.
Artykuły, które napisałeś są fajne, proste i dobrze tłumaczą zagadnienia komuś takiemu jak ja, który dopiero startuje. Napisałeś je jednak dość dawno. Może byś wrócił do nich i nieco je rozszerzył. Przydały by się jakieś bardziej złożone przykłady programów z komentarzami. Myślę, że zbyt dużo pracy by Ci to nie przysporzyło a takim jak ja bardzo by to pomogło.
Z góry serdecznie dziękuję i pozdrawiam życząc Wesołych Świąt.

Użytkownik Jarek napisał:

28 kwietnia 2018


Witaj, artykuł bardzo pomocny. Borykam się teraz ze strukturami na studiach.
Dziękuję

Zachęcam Cię do zostawienia komentarza!

Ilość znaków: 0