Что не разрешено с функциями-членами const? - PullRequest
3 голосов
/ 25 июля 2010
class A{
private:
    int a;
public:
    A() {a = 4;}
    const int& random1() const {return a; }
    //int&     random2() const {return a; }
    const int* random3() const {return &a;}
    //int*     random4() const {return &a;}
};

int main(){
    A objA;
    cout<<objA.random1()<<"\n";
    cout<<*objA.random3()<<"\n";
}

random2() и random4() не разрешены, как определено выше. Я как-то знал это все время, но никогда не сталкивался с этим при написании собственного кода, до сегодняшнего дня.

Что все, кроме этих двух случаев, не разрешено в функциях-членах const?

Любая ссылка на стандартный текст C ++ также будет полезна. Спасибо!

Ответы [ 2 ]

10 голосов
/ 25 июля 2010

Сначала поймите, что const T* - это указатель на некоторый T, который нельзя изменить.Второе, что нужно помнить, это то, что все члены фактически доступны через this->.

. Итак (§9.3.1):

Нестатическая функция-член может быть объявлена ​​как const, volatile,или const volatile.Эти cvqualifiers влияют на тип указателя this (9.3.2).

И что он делает (§9.3.2):

В теле нестатического(9.3) функция-член, ключевое слово this является выражением, не имеющим значения, значением которого является адрес объекта, для которого вызывается функция.Тип этого в функции-члене класса X - X *.Если функция-член объявлена ​​как const, типом этого является const X *, если функция-член объявлена ​​как volatile, типом этого является volatile X *, а если функция-член объявлена ​​как const volatile, типом этого является constvolatile X *.

A const для функции делает указатель this const T*.

. Вот почему эти примеры терпят неудачу: В варианте int&,a доступен как this->a, this - const T*, поэтому a - const intconst int не может быть неявно преобразовано в int&.То же самое с другой функцией.

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

0 голосов
/ 26 июля 2010

Константные функции-члены не могут вызывать неконстантные функции-члены, даже если они не изменяют никаких данных-членов. Иногда вам нужно предоставить как константную, так и неконстантную версии одной и той же функции, поскольку этот указатель неявно передается функциям-членам и играет роль в разрешении перегрузки.

...