Требуется уточнение функции члена const - PullRequest
4 голосов
/ 27 апреля 2011

Я немного озадачен тем, почему этот код компилируется и запускается:

class A
{
private:
    int* b;
public:
    A() : b((int*)0xffffffff) {}
    int* get_b() const {return this->b;}
};

int main()
{
    A a;
    int *b = a.get_b();
    cout<<std::hex<<b<<endl;
    return 0;
}

Результат выполнения этого кода тоже FFFFFFFF ... неожиданно для меня. Разве this->b не должен возвращать const int*, поскольку он находится в функции-члене const? и поэтому строка return должна генерировать ошибку приведения компилятора при попытке привести const int* к int*

Очевидно, здесь есть пробел в моих знаниях о том, что означают функции-члены const. Буду признателен, если кто-нибудь поможет мне преодолеть этот разрыв.

Ответы [ 4 ]

4 голосов
/ 27 апреля 2011

Нет, член является int* const (как видно из функции const), который совершенно другой.

Указатель является const, а не объектом, на который указывает.

2 голосов
/ 27 апреля 2011

Функция возвращает целочисленный указатель по значению - вы не можете изменить член класса, копию которого он является, через это значение, поэтому нет нарушения const.

2 голосов
/ 27 апреля 2011

Часть const функции-члена просто говорит, что функция может вызываться, когда указатель this (он же объект, для которого она вызывается) является константой. Это не имеет ничего общего с возвращаемым значением.

class A{
public:
  void non_const_func(){}
  void const_func() const {}
};

int main(){
  A a;
  a.const_func(); // works
  a.non_const_func(); // works too

  const A c_a;
  c_a.const_func(); // works again
  c_a.non_const_func(); // EEEK! Error, object is const but function isn't!

}

0 голосов
/ 27 апреля 2011

Помещение const после объявления функции, как у вас, говорит компилятору: "Эй, я обещаю не модифицировать *this!". Ваш метод - просто средство доступа.

См. C ++ FAQ LITE 18.10

...