int & geta(void) const { return *a; } // good?
int & getb(void) const { return b; } // obviously bad
В const-функции каждый элемент данных становится const таким образом, что его нельзя изменить .int
становится const int
, int *
становится int * const
и так далее.
Поскольку тип из a
в вашей первой функции становится int * const
, в отличие от const int *
, поэтому вы можете изменять данные (которые можно изменять):
m.geta() = 5; //works, as the data is modifiable
Разница между const int*
и int * const
.
const int*
означает, что указатель неконстантен , но данные, на которые указывает указательis const . int * const
означает, что указатель const , но данные, на которые указывает указатель, non-const .
Ваша вторая функция пытается вернуть const int &
, поскольку тип из b
становится const int
.Но вы упомянули фактический тип возврата в вашем коде как int &
, поэтому эта функция не даже компилируется (см. this ), независимо от того, что вы делаете в main()
потому что возвращаемый тип не совпадает.Вот исправление:
const int & getb(void) const { return b; }
Теперь оно прекрасно компилируется! .