Возврат неконстантной ссылки из константной функции-члена - PullRequest
6 голосов
/ 20 февраля 2011

Почему возврат ссылки на указанную переменную-член работает, а не другую? Я знаю, что функция-член const должна возвращать только ссылки const, но почему это не так для указателей?

class MyClass
{
  private:
    int * a;
    int b;
  public:
    MyClass() { a = new int; }
    ~MyClass() { delete a; }

    int & geta(void) const { return *a; } // good?
    int & getb(void) const { return b; }  // obviously bad
};

int main(void)
{
  MyClass m;

  m.geta() = 5;  //works????
  m.getb() = 7;  //doesn't compile

  return 0;
}

Ответы [ 2 ]

20 голосов
/ 20 февраля 2011
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; }  

Теперь оно прекрасно компилируется! .

6 голосов
/ 20 февраля 2011

Потому что a становится int * const a;.То есть вы не можете изменить значение a (изменить то, на что оно указывает), как говорит const.Константность того, что a указывает на , является совершенно другой проблемой.

Пожалуйста, посмотрите мой ответ здесь для подробного обсуждения функций const и const..

...