*   >> Leitura Educação Artigos >> science >> programação

C ++ & amp; # 039; s mutável e conceitual Constness

Porque Pessoa é const, take_pulse não pode chamar set_name (). Porque Pessoa é uma referência, podemos passar em um robô do robô e obter a resposta correta (false). * /Bool take_pulse (const Pessoa & X) {return X.has_pulse (); }

Ele é bobagem para fazer o salário mutável; você está apenas fazendo o possível para o código que obtém um objeto constante de mexer com o salário. Se o empregado é constante, você não deveria estar brincando com o seu salário.


Então, o que se quiser nome e ID do empregado a ser constantes, mas não é o salário? Bem, é só dizer

class Employee {public: Employee (string name = "No Name", string id = "000-00-0000", duplo salário = 0): _name (nome), _id (id) {_salary = salário; } Seqüência de getName () const {_name retorno;} getid string () const {_id retorno;} getSalary () const double {return _salary;} setSalary void (duplo salário) {_salary = salário;} vazio promover (duplo salário) { _salary = salário;} privado: const _name string; _id const string; duplo _salary; };

Agora, eles estão constante.

Claro, isso significa que você só pode configurá-los no construtor.

Então, se a loucura acima não é o que é mutável para, o que é isso? Aqui está o exemplo sutil: mutável é para o caso em que um objeto é

logicamente constante, mas na prática precisa mudar. Estes casos são poucos e distantes entre si, mas eles existem

Aqui está um exemplo:. Você tem um objeto constante, mas para fins de depuração deseja controlar quantas vezes um método constante é chamado sobre ele. Logicamente você não está alterando o objeto.

Note que se você está tomando decisões em seu programa baseado em uma variável mutável, você quase certamente violou constness lógico e necessário repensar as coisas

class Employee {public:. Empregado (std :: string const & nome): _name (nome), _access_count

(0) {} set_name void (const std :: string & name) {_name = nome; } Std :: get_name string () const {_access_count ++; retornar _name; } Int get_access_count () const {_access_count retorno; } Private: std :: string _name; mutável int _access_count; };

Como um exemplo mais complexo, você pode querer armazenar em cache os resultados de uma operação cara:

 classe MathObject {public: MathObject) (: pi_cached (false) {} double pi () const {if (! pi_cached) {/* Esta é uma maneira incrivelmente lento para calcular pi.

* /Pi = 4; para (long passo = 3; passo

Agora nós não calcular pi até que al

Page   <<  [1] [2] [3] >>
Copyright © 2008 - 2016 Leitura Educação Artigos,https://artigos.nmjjxx.com All rights reserved.