utworzone przez Michał Wiertlewski | 30 października 2017 | C++11
Referencje do r-wartości.
Semantyka przeniesienia to jedna z kluczowych koncepcji nowoczesnego języka C++, która zadebiutowała w C++11. Sam język potrzebował jednak kilku nowych funkcjonalności, które umożliwiłyby wprowadzenie tej idei w życie.
Podstawą stały się referencje do r-wartości (ang. r-value references).
(więcej…)
utworzone przez Michał Wiertlewski | 8 sierpnia 2017 | C++11
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.
(więcej…)
utworzone przez Michał Wiertlewski | 6 sierpnia 2017 | C++11
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.
(więcej…)
utworzone przez Michał Wiertlewski | 18 maja 2017 | C++11
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.
(więcej…)
utworzone przez Michał Wiertlewski | 16 stycznia 2017 | C++11
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.
(więcej…)
utworzone przez Michał Wiertlewski | 8 stycznia 2017 | C++11
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++.
(więcej…)