Aha Păi… în cazul ăsta particular, qualifier-ul const
de regula indică ca variabila aia NU va fi modificata de catre functie. Daca lipseste const
, cel mai probabil programatorul care a creat-o intentioneaza s-o modifice (de exemplu o foloseste ca output).
Exemplu:
void ceva(const std::string &str)
{
// diverse operatii
// dar nici una nu poate modifica str
// pur si simplu va da eroare de compilare
....
}
std::string mystr = "blabla";
ceva(mystr);
// output-ul va fi "blabla"
std::cout << mystr << endl;
În cazul asta sunt (destul de) sigur ca functia ceva()
va lasa mystr
in pace, nu-l va modifica. E un soi de “promisiune”.
Insa, in cazul urmator situatia poate sta complet diferit.
void ceva(std::string &str)
{
// deorece a fost pasat prin referintă, putem schimba
// continului lui mystr
str = "BUM";
}
std::string mystr = "blabla";
ceva(mystr);
// output-ul va fi "BUM"
std::cout << mystr << endl;
În cazul de mai sus, functia ceva()
va putea manipula string-ul nostru şi e destul de probabil că o va face. Când un programator defineste o functie in felul asta de fapt ne informeaza ca intenţionează sa modifice acel argument. Nici macar nu e nevoie sa citesc documentatia, stiu la ce trebuie sa ma astept.
Well, cand programatorul NU tine cont de conventiile astea se poate considera ca nu prea e “team player”, nici macar cu el insusi. Si nu ţine scuza cu “ma grabeam si n-aveam timp sa scriu const
peste tot”. Asta devine un automatism si nici macar nu te mai gandesti ca ai face economie de timp daca nu tastezi cele 5 caractere. E ca si cum ai alege sa scrii int
in loc de double
doar pentru ca primul e mai scurt
EDIT: uite ce urat face compilatorul daca incerci sa modifici o variabila constanta.
test1.cpp: In function ‘void ceva(const string&)’:
test1.cpp:8:11: error: passing ‘const string {aka const std::__cxx11::basic_string<char>}’ as ‘this’ argument discards qualifiers [-fpermissive]
str = "BUM";
^~~~~
In file included from /usr/include/c++/7/string:52:0,
from test1.cpp:1:
/usr/include/c++/7/bits/basic_string.h:692:7: note: in call to ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’
operator=(const _CharT* __s)