#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