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

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

A palavra-chave mutável é usada para permitir que um membro do objeto const de dados específico a ser modificado. Isto é particularmente útil se a maioria dos membros deve ser constante, mas alguns precisam ser actualizável. Suponha que nós adicionamos um membro do "salário" para a nossa classe Employee. Enquanto o nome do funcionário e do ID pode ser constante, o salário não deve ser. Aqui é a nossa classe atualizado

class Employee {public:.

Empregado (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;} setName void (string name) {_name = nome;} seqüência getid () const {_id retorno;} setId void (string id) {_id = id;} getSalary () const duplo {return _salary;} setSalary void (duplo salário) {_salary = salário;} vazio promover (duplo salário) const {_salary = salário;} privado: string _name; corda _id; _salary dupla mutável; };

Agora, mesmo para um objeto Employee const, o salário pode ser modificado

Employee const john ("John", "007", 5000.

0).; .... .... John.promote (20.000,0);

Não, não! Mil vezes, não

! Eu já vi esse tipo de idéia terrível antes. Este tipo de loucura leva a código de falha e derrota a finalidade inteira de const em C ++. Só posso concluir que as pessoas que escrevem esse tipo de absurdo em si não entender o propósito do mutável. Então, eles ensinam um erro, transmitindo esse absurdo para o próximo grupo de C ++ programadores que passá-lo em si mesmos. Isto tem de parar.


Quando você marca uma const variável, você está prometendo (e perguntando C ++ para fazer valer) que você nunca vai modificar logicamente o conteúdo desse objeto. Talvez a razão mais útil de fazer isso é quando você passar um objeto em uma função por referência ou ponteiro. Ao torná-lo const, a função promete não mexer com o seu objeto. Por exemplo, digamos que você tenha um robô classe que herda de Pessoa. Você quer passar o seu robô para o take_pulse função. Você quer take_pulse de usar métodos de substituição do robô, por isso take_pulse leva o objeto por referência.

Porque é const, você pode ter certeza que take_pulse não irá modificar o robô, basta ler a partir dele:

Pessoa classe {public: has_pulse bool virtual () const {return true; } Set_name void () {/* ... * /}}; classe Robot: Pessoa pública {public: has_pulse bool virtual () const {return false; } Set_name void () {/* ... * /}}; /*

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