Функции-члены const могут вызывать только функции-члены const? - PullRequest
1 голос
/ 06 января 2011

Вызывают ли функции-члены const только функции-члены const?

class Transmitter{
  const static string msg;
  mutable int size;
  public: 
    void xmit() const{
    size = compute();
    cout<<msg;
  }
  private:
   int compute() const{return 5;}
};

 string const Transmitter::msg = "beep";

 int main(){
   Transmitter t;
   t.xmit();
   return EXIT_SUCCESS;
 }

Если я не делаю compute () const, то компилятор жалуется.Это потому, что поскольку функция-член const не может изменять члены, она не будет разрешать любые вызовы неконстантам, поскольку это будет означать, что функция-член const будет «косвенно» изменять элементы данных?

Ответы [ 5 ]

4 голосов
/ 06 января 2011

Это потому, что поскольку функция-член const не может изменять члены, она не будет разрешать любые вызовы неконстантам, поскольку это будет означать, что функция-член const будет "косвенно" изменять элементы данных?1002 *

Да.

2 голосов
/ 06 января 2011

Да: const функции-члены видят только версию класса const, что означает, что компилятор не найдет не-const членов (данных или функций) внутри const функции-члена.

Этот эффект распространяется на const объекты (экземпляры) класса, где доступны только const члены.

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

1 голос
/ 06 января 2011

Ваше утверждение и ваш анализ верны.

1 голос
/ 06 января 2011

Как говорили другие; да.

Если есть конкретная причина, по которой вы хотите, чтобы вычисления были неконстантными, например, если он использует некоторый локальный кеш для хранения вычислений, то вы все равно можете вызывать его из других функций, которые объявлены как const, объявив версию const

  private:
       int compute() const{return ( const_cast<Transmitter*>(this)->compute());}
       int compute() {return 5;}
1 голос
/ 06 января 2011

Да.Когда вы вызываете 'xmit ()', его указатель 'this' будет константным, то есть вы не сможете вызывать неконстантный метод оттуда, следовательно, 'compute ()' должен быть const

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...