Varbūtējs dublikāts: “const” pēdējā vārda nozīme C++ metodes deklarācijā?
Man ir grāmata, kur ir rakstīts kaut kas līdzīgs:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
Ko tas nozīmē?
"const funkcija", kas apzīmēta ar atslēgas vārdu const
pēc funkcijas deklarācijas, padara par kompilatora kļūdu, ja šīs klases funkcija maina klases locekļa mainīgo. Tomēr klases mainīgo nolasīšana funkcijas iekšpusē ir pieļaujama, bet rakstīšana šīs funkcijas iekšpusē radīs kompilatora kļūdu.
Cits veids, kā domāt par šādu "const funkciju", ir aplūkot klases funkciju kā parastu funkciju, kas iegūst netiešu this
rādītāju. Tādējādi metode int Foo::Bar(int random_arg)
(bez const beigās) rada funkciju int Foo_Bar(Foo* this, int random_arg)
, un izsaukums, piemēram, Foo f; f.Bar(4)
, iekšēji atbilst kaut kam līdzīgam Foo f; Foo_Bar(&f, 4)
. Tagad, beigās pievienojot const (int Foo::Bar(int random_arg) const
), to var saprast kā deklarāciju ar const this rādītāju: int Foo_Bar(const Foo* this, int random_arg)
. Tā kā this
tips šādā gadījumā ir const, nav iespējamas nekādas locekļu mainīgo modifikācijas.
Ir iespējams mazināt "const funkcija" ierobežojumu, kas neļauj funkcijai rakstīt uz jebkuru klases mainīgo. Lai dažus mainīgos varētu rakstīt pat tad, ja funkcija ir apzīmēta kā "const funkcija", šie klases mainīgie tiek apzīmēti ar atslēgas vārdu mutable
. Tādējādi, ja klases mainīgais ir atzīmēts kā mainīgs un "const funkcija" ieraksta šo mainīgo, tad kods tiks kompilēts tīri un mainīgo būs iespējams mainīt. (C++11)
Kā parasti, strādājot ar atslēgas vārdu const
, atslēgas vārda const atrašanās vietas maiņai C++ izteikumā ir pavisam cita nozīme. Iepriekš minētais const
lietojums attiecas tikai uz gadījumiem, kad const
tiek pievienots funkcijas deklarācijas beigās aiz iekavām.
const
ir ļoti bieži pārlieku izmantots C++ valodas kvalifikators: tā sintakse un sakārtošana kombinācijā ar rādītājiem bieži vien nav vienkārša. Daži lasījumi par const
pareizību un atslēgas vārdu const
: