C++11 #11: Inteligentne wskaźniki wchodzą do gry: std::shared_ptr, std::weak_ptr.

std::shared_ptr.

W odróżnieniu od std::unique_ptr, std::shared_ptr opiera się na współdzieleniu właśności (ang. shared ownership) przechowywanego zasobu. Z tego powodu możemy posiadać wiele inteligentnych wskaźników typu std::shared_ptr, wskazujących na ten sam obiekt w pamięci.

Ten koncept ma bardzo dużo wspólnego z realizacją automatycznego odśmiecania pamięci w innych językach programowania, ponieważ klasa std::shared_ptr ma zaimplementowany mechanizm tzw. zliczania referencji.

Czytaj dalej

C++11 #10: Inteligentne wskaźniki wchodzą do gry: std::unique_ptr.

Inteligentne wskaźniki wchodzą do gry.

Do tej pory wpisy na temat C++11 dotyczyły bardzo ważnych i przydatnych zmian w języku. Jednak to zarządzanie pamięcią i wskaźniki doczekały się największych, fundamentalnych usprawnień w nowym standardzie – jednym z najważniejszych są tzw. inteligentne wskaźniki.

Oczywiście nadal można ręcznie zarządzać pamięcią w C++ – to fundament języka. Nie wyklucza to jednak wprowadzania nowych rozwiązań, które przyczyniają się do drastycznych zmian w sposobie zarządzania życiem obiektów i jednocześnie eliminują większość paskudnych błędów.

Czytaj dalej

C++11 #9: Wyłączanie funkcji z użycia: słowo kluczowe delete.

Słowo kluczowe delete w deklaracji funkcji.

Czasami zachodzi potrzeba uniemożliwienia wywołania konkretnej funkcji. A dokładniej – zadbania o to, żeby zdefiniowanej wcześniej funkcji nie można było użyć w kodzie importującym/używającym wcześniej zdefiniowanych konstrukcji.

Najciekawsze są sytuacje, w których kompilator samodzielnie jest w stanie wygenerować teoretycznie potrzebne funkcje i użyć ich, co pozbawia nas niejako kontroli nad tym procesem. Przykładem są tutaj choćby funkcje szablonowe, czy też automatycznie generowane konstruktory oraz operatory w klasach.

Czytaj dalej

C++11 #8: Przeciążanie funkcji wirtualnych: specyfikator final.

Specyfikator final.

W poprzednim wpisie z serii C++11 opisałem specyfikator override. Niejako w parze z nim występuje specyfikator final, który również odnosi się do przeciążania funkcji wirtualnych w klasach pochodnych.

Mówiąc krótko: jeśli nie chcemy, żeby funkcja wirtualna była dalej przeciążana (w kolejnych klasach pochodnych w hierarchii), możemy użyć słowa final w deklaracji funkcji – dokładnie tak samo, jak wykorzystujemy override.

Czytaj dalej

C++ Core Guidelines.

C++ Core Guidelines.

C++ Core Guidelines – co to jest ? Jest to temat, którym warto się poważniej zainteresować – a przynajmniej ja go za taki uważam 🙂

C++ Core Guidelines jest projektem, wystartowanym przez Bjarne Stroustrup’a (tego pana powinniście kojarzyć) i prowadzonym z pomocą Herb’a Sutter’a (też bardzo znany zawodnik).

Czytaj dalej

C++11 #7: Przeciążanie funkcji wirtualnych: specyfikator override.

Do każdego aspektu języka, z którego korzystamy, możemy mieć mniejsze lub większe uwagi. Oczywiście również posiadam swoją subiektywną listę niedociągnięć, jeśli chodzi o język C++.

Pomimo tego, że bardzo docieniam polimorfizm i sposób zaimplementowania tego mechanizmu, za niedopracowane uważam kwestie związane z dziedziczeniem i wykorzystaniem funkcji wirtualnych w C++.

Czytaj dalej

python

Mini Kurs Pythona #1: Dlaczego Python 3 ?

No właśnie… Dlaczego ?

Z Pythonem w wersji trzeciej zetknąłem się jakieś 3-4 lata temu. Potrzebowałem narzędzia, które w szybki sposób będę mógł zmusić do skutecznego przetwarzania dużej ilości danych tekstowych. Wybór okazał się trafny, ponieważ już w ciągu kilku dni zacząłem pisać dość nietrywialne skrypty, korzystające intensywnie z biblioteki standardowej Pythona.

Czytaj dalej

C++11 #6: Silne typy wyliczeniowe.

Większość programistów języka C++ zna doskonale typy wyliczeniowe (enum), zdefiniowane w standardzie C++98/03. Jest to wygodne, często wykorzystywane narzędzie. Jest to jednak również funkcjonalność, która posiada kilka zauważalnych niedociągnięć, przez co użycie typów wyliczeniowych nie jest tak przyjemne i odporne na błędy, jak mogłoby być.

W standardzie C++11 doczekaliśmy się pod tym względem malutkiej rewolucji – zdefiniowane zostały tzw. silne typy wyliczeniowe (ang. strongly-typed enums).

Czytaj dalej