2013-04-25 3 views
1

Я изучаю C++, и я читал это: Если член данных объявлен изменчивым, тогда законно присвоить значение этому элементу данных из функции const member. Но следующий код скомпилирован без какой-либо ошибки или предупреждения от gcc. (Это не реальный пример кода, я просто написал ее, чтобы проверить изменяемые ключевое слово)Mutable variable, измененная функцией non-const member

class M 
{ 
public: 
    M(){x=10;}; 
    int getX() {x++; return x;}; 
private: 
    mutable int x; 
}; 

int main() 
{ 
    M xx; 
    std::cout << xx.getX() << std::endl; 
} 

не Должен ли я объявить GetX как константы?

Edit 1 (ForEver Ответим делает вещи более ясно), следующий код не будет компилироваться:

class M 
{ 
public: 
    M(){x=10;}; 
    int getX() const {x++; return x;}; 
private: 
    int x; 
}; 

int main() 
{ 
    M xx; 
    std::cout << xx.getX() << std::endl; 
} 
+3

Это утверждение не говорит о том, что функция-член ** должна быть const. Я рекомендую учиться и понимать 'const' перед обучением' mutable'. –

+0

Обычно что-либо, что разрешено в функции const, также допускается в неконстантной функции. Функция Const более ограничительна, чем не константа. – Spook

+1

Я имею в виду не обиду этим, но как бы вы оценили свое понимание на английском? Проблема здесь в том, что у вас есть основное непонимание смысла этого предложения. –

ответ

3

Это легально изменить mutables в const функций и, конечно, это законно изменить mutables в non-const функции (как каждый non-const member-variable). Ключевое слово mutable позволяет изменять переменную в const функции, но не дает никаких ограничений на изменение в функциях non-const.

+0

Это не пример кода в реальном мире, я просто написал его, чтобы проверить ключевое слово mutable –

0

mutable обычно используется для определения квалифицированных функций-членов const для изменения кэшированных данных. Вы можете объявить getX() как const и счастливо изменить x, это то, что изменено для. Однако обычно считается плохой идеей изменить внутреннее состояние объекта в функции-члене, которое, по его словам, говорит, что это не так.

Например, у вас есть функция-член const, которая вычисляет значение на основе содержимого контейнера. Если в контейнере много элементов, это может занять много времени, чтобы получить результат. Если результат изменяется только при добавлении или удалении элементов из контейнера, вы можете кэшировать его для последующего использования. Поскольку функция-член является константой, вам нужно объявить переменную результата как mutable. Поскольку результат может быть рассчитан из существующих данных в контейнере, кешированное значение не считается частью внутреннего состояния объекта, и считается, что ОК модифицирует его с помощью функции const.

int Foo::CalcResult() const 
{ 
    if(hasValidCache_ == false) 
    { 

     // ... recalc value ... 

     // Cache the result 
     hasValidCache = true; 
     cachedValue_ result; 
    } 

    return cachedValue_; 
} 
0

Заявление означает это.

class M 
{ 
public: 
    M(){x=10;}; 
    int getX() const 
//   ^^^^^ If a member function is const... 

        {x++; return x;}; 
//     ^^^ ...and it modifies a member variable... 
private: 
    mutable int x; 
// ^^^^^^^ ...then that variable must be mutable. 
}; 
Смежные вопросы