требуется уточнение функции-члена const

#c #constants #this #member-functions

#c #константы #это #функции-члены

Вопрос:

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

 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. Я был бы признателен, если бы кто-нибудь мог помочь мне преодолеть этот пробел.

Ответ №1:

Нет, членом является int* const (как видно из функции const), которая полностью отличается.

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

Комментарии:

1. Правильно. Это все объясняет. Итак, если бы b было int, и get_b попытался бы вернуть this-> b, тогда я бы получил ошибку преобразования приведения. Верно?

2. Если бы b было int и вы попытались вернуть amp;b , компилятор пожаловался бы на это, да.

Ответ №2:

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

 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!
  

}

Ответ №3:

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

Ответ №4:

Указание const после объявления функции, как у вас, сообщает компилятору «Эй, я обещаю не изменять *this !». Ваш метод — это просто средство доступа.

Смотрите C FAQ LITE 18.10