• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Dlaczego const jest taki ważny + jak strzelić sobie w stopę przy const?

Object Storage Arubacloud
0 głosów
709 wizyt
pytanie zadane 27 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Witam.

 

Chciałbym prosić forumowiczów o wyjaśnienie dlaczego const jest taki ważny oraz w jakich sytuacjach można sobie strzelić w stopę podczas korzystania z '?consta? 

Miałem kiedyś taką funkcję:

string name(const string &arg, const string &arg2, const string &arg3)

Kiedy chciałem do niej przesłać NULL to program się sypał. Wiem, że referencja nie może być "pusta", ale czy mogłaby to też być wina consta?

 

Jeśli ktoś ma jakieś dobre, w miarę aktualne materiały, to również bym prosił.

 

 

Pozdrawiam, Hiskiel.

3 odpowiedzi

+3 głosów
odpowiedź 27 marca 2018 przez monika90 Pasjonat (22,940 p.)
edycja 27 marca 2018 przez monika90
To że twój program się wysypał nie ma nic wspólnego ani z referencjami, ani z const, po prostu nie można utworzyć stringa na podstawie wskaźnika równego NULL - zachowanie jest niezdefiniowane.

Const ułatwia rozumienie programów, dobrze jest wiedzieć które operacje zmieniają stan obiektów, a które nie. Const pozwala na przekazanie czytającym kod tej informacji w deklaracjach funkcji. Chyba jedyna sytuacja gdy można sobie strzelić w stopę za pomocą const, to gdy programista kłamie - obiecał za pomocą const, że funkcja nie modyfikuje parametru, a ona modyfikuje - ale na to jest prosty sposób, po prostu tak nie rób.
+1 głos
odpowiedź 27 marca 2018 przez niezalogowany

https://isocpp.org/wiki/faq/const-correctness

Kiedy chciałem do niej przesłać NULL to program się sypał. Wiem, że referencja nie może być "pusta", ale czy mogłaby to też być wina consta?

Nie. Pewnie kompilator użył dla NULLa konstruktora, który jako argument przyjmuje const char* i dlatego program się sypał.

0 głosów
odpowiedź 28 marca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

const jest ważny gdy chcesz zablokować zmiennej możliwość zamiany wartości. Możesz modyfikator const stosować zamiast makro #define lub podczas usuwania "magicznych" liczb/wartości np.

#define LICZBA 55 //LICZBA jest podmieniana w programie przez preprocesor
const int liczba = 55; // zmienna liczba jest używana przez kompilator 
//więc jest sprawdzana jej zgodność itp



for(int i = 0; i < 4; ++i)

const int liczba_bokow = 4;//przykladowa nazwa
for(int i = 0 ; i < liczba_bokow; ++i)

Według mnie najważniejsze zastosowanie const jest podczas przesyłania obiektu przez referencje do funkcji.Np

string name(const obiekt &arg)

Widząc takie wyrażenie kompilator zoptymalizuje sobie działanie. Wie że obiekt nie może ulec zmianie oraz jest przesyłany jego oryginał nie kopia. Troszkę przyspieszy to szybkość wykonywania programu.

Dobrą praktyką jest dodanie modyfikatora const do konstruktora kopiującego np.

Konstruktor(const Konstruktor&)

Dzięki przydomkowi const możesz skopiować obiekt, który posiada pole z tym modyfikatorem.

Przy pracy z const musisz uważać z szablonem const_cas<>() bo możesz wywołać undefined behavior

const int a = 0;
const int *pa = &a;

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior 
cout << a << *p;  

Więcej info

http://wojtek-m.blogspot.com/2010/08/wszystko-co-musisz-wiedziec-o-const-w-c.html

Podobne pytania

0 głosów
2 odpowiedzi 638 wizyt
pytanie zadane 21 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
2 odpowiedzi 189 wizyt
0 głosów
2 odpowiedzi 827 wizyt
pytanie zadane 15 listopada 2016 w C i C++ przez timrh Mądrala (6,030 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...