Эффективно делает указатель this
константным указателем на const вместо константного указателя на неконстантный. Таким образом, всякий раз, когда вы ссылаетесь на this
в функции-члене const - явно или неявно - вы используете указатель const для const.
Итак, в случае с классом, который у вас здесь есть, в любой неконстантной функции тип this
равен WithStatic const *
, а в константных функциях его тип равен const WithStatic * const
.
Как и в случае с любым указателем на const, вы не можете изменить ничего, на что он указывает. Таким образом, вы не можете изменить ни одну из его переменных-членов и не можете вызвать ни одну из ее неконстантных функций-членов.
Вообще говоря, было бы неплохо сделать функцию-член константной, если вы можете разумно это сделать, потому что она гарантирует, что вы не собираетесь изменять состояние объекта, и вы можете вызывать ее с помощью объекта const.
возможно для переменных-членов, которые могут быть изменены, если они mutable
или volatile
, но это более сложные темы, которые, вероятно, лучше избегать, пока вы не будете лучше знакомы с языком , Конечно, вам обычно не нужно беспокоиться о них и не следует использовать их, если вам это не нужно. Также можно отбросить константность указателя this
, и в этот момент вы можете изменить его, но IIRC - это неопределенное поведение, и это определенно считается плохой идеей. Так, есть случаи, когда возможно изменить состояние объекта в функции-члене const, но обычно это невозможно и лучше избегать, даже если это так.
Когда вы делаете функцию-член const, вы фактически обещаете, что при вызове этой функции состояние объекта не изменится (хотя, очевидно, могут быть побочные эффекты, о чем свидетельствует тот факт, что вы можете вызывать такие функции, как printf()
).