Para você, o que é um objeto imutável?

55 views
Skip to first unread message

Fabrício Cabral

unread,
May 21, 2025, 4:16:11 PMMay 21
to ccppbrasil
Pessoal,

Perguntinha direta, igual ao subject: para você, o que é um objeto imutável? Como criar um em C++?

At.te.

--
--fx

pontilh...@gmail.com

unread,
May 21, 2025, 5:42:20 PMMay 21
to ccppb...@googlegroups.com
Uma classe onde o construtor seja o único meio de setar valores aos atributos.

Att.
Jorge A Pontilho

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver esta conversa, acesse https://groups.google.com/d/msgid/ccppbrasil/CAKUebb-0cOq360K1jXBGYm3%3DFxJpwV8YQAp-CtsgNDQYTzBJFg%40mail.gmail.com.

Fabrício Cabral

unread,
May 21, 2025, 5:47:17 PMMay 21
to ccppb...@googlegroups.com
Mas não declara os atributos com const?



--
--fx

Virgilio Fornazin

unread,
May 21, 2025, 5:57:16 PMMay 21
to ccppb...@googlegroups.com
Objetos imutaveis como uma string no .NET CLR (C#) tem motivos: 

- otimizar operações com hashtables;
- usar o objeto System.String como um 'value type' (algo como struct ou int) diretamente.

É mais para otimização do que outro fundamento necessário.

'Objeto' imutável em C++ (onde tudo é 'value type') é só usar const.
O que também não impede de vc dar 'write' na memória (se tiver direito) e modificar o conteúdo.

São linguagens diferentes com conceitos diferentes.

pontilh...@gmail.com

unread,
May 21, 2025, 6:03:42 PMMay 21
to ccppb...@googlegroups.com
Ah sim, com certeza o const daria essa garantia.
Estou pensando em uma classe q faz um determinado cálculo e vc passa tds os parâmetros no construtor.
O próprio construtor chama o método (privado) para fazer o cálculo.
E o único método público seria tipo getResultado()

Acho q seria isso.


Att.
Jorge A Pontilho

Bruno Sanches

unread,
May 21, 2025, 6:05:06 PMMay 21
to ccppb...@googlegroups.com
Ao meu ver seu exemplo conta como const. O que importa eh a classe garantir que após ser construída, seu estado não mude, como ela faz isso, problema dela.

Virgilio Fornazin

unread,
May 21, 2025, 6:05:18 PMMay 21
to ccppb...@googlegroups.com
Ai eh mais facil escrever uma funcao, nao precisa desse overkill

Bruno Sanches

unread,
May 22, 2025, 8:40:37 AMMay 22
to ccppb...@googlegroups.com

pontilh...@gmail.com

unread,
May 22, 2025, 10:08:38 AMMay 22
to ccppb...@googlegroups.com
Sim, mas não seria um objeto imutável.

Será q alguém já teve a experiência onde um objeto imutável foi necessário? 

Att.
Jorge A Pontilho

Fabrício Cabral

unread,
May 22, 2025, 10:21:44 AMMay 22
to ccppb...@googlegroups.com
Objetos imutáveis têm como característica poderem ser compartilhados com outros objetos sem o medo de que eles sejam alterados. Essa característica traz
como efeito colateral ser thread-safe, ou seja, em um ambiente de concorrência ele não vai dar (muitos) problemas (ainda têm outros problemas).

At.te.



--
--fx

pontilh...@gmail.com

unread,
May 22, 2025, 10:24:05 AMMay 22
to ccppb...@googlegroups.com
Ah entendi,
Valeu Fabrício.

Att.
Jorge A Pontilho

Patrick José

unread,
May 22, 2025, 10:56:30 AMMay 22
to ccppb...@googlegroups.com
Uma linguagem que tem por padrão objetos imutáveis é o Rust. 


Fabrício Cabral

unread,
May 22, 2025, 10:59:52 AMMay 22
to ccppb...@googlegroups.com
É, mas não adianta nada ter por padrão objetos imutáveis se eu posso alterar isso usando a palavra reservada 'mut', não é?

As linguagens de paradigma funcional Lisp, Clojure, Scheme, Haskel, F# têm por padrão serem imutáveis e não dá (que eu saiba) para mudar isso.

At.te.



--
--fx

Felipe Magno de Almeida

unread,
May 22, 2025, 11:26:00 AMMay 22
to ccppb...@googlegroups.com
On Thu, May 22, 2025 at 11:59 AM Fabrício Cabral <fabri...@gmail.com> wrote:
>
> É, mas não adianta nada ter por padrão objetos imutáveis se eu posso alterar isso usando a palavra reservada 'mut', não é?
>
> As linguagens de paradigma funcional Lisp, Clojure, Scheme, Haskel, F# têm por padrão serem imutáveis e não dá (que eu saiba) para mudar isso.

Linguagens funcionais puras não possuem objetos imutáveis. Eles não
possuem objetos, apenas valores.

> At.te.

[]'s
--
Felipe Magno de Almeida
Owner @ Expertise Solutions
www: https://expertise.dev
phone: +55 48 9 9681.0157
LinkedIn: in/felipealmeida

Bruno Sanches

unread,
May 22, 2025, 11:37:49 AMMay 22
to ccppb...@googlegroups.com
Eu tenho um caso bem específico aqui de uma classe que armazena strings que ficam em um cache, que nunca morre e nunca são alteradas. A classe apenas guarda um indice para a tabela onde estão os nomes, totalmente imutável. Foi feita para ser leve e para quando tiver maps, sets, não ter que ficar comparando strings...

Mas é um caso bem específico.


Bruno Sanches
========================
https://github.com/bcsanches



Thiago Adams

unread,
Sep 9, 2025, 10:17:54 AM (13 days ago) Sep 9
to ccppbrasil

Estava pensando em uma forma de diferenciar o conceito 
de const imutável x  const somente leitura.

Imutável é aquele objeto que é construído por uma 
expressão constante e que tem o tempo de vida do programa. 

Exemplo:

const int i = 1;
int main()
{
}

Qualquer outro é equivalente a "somente leitura".

Existe uma diferença também entre C e C++, já que o C++ pode ter 
constructor e destructor chamados em objetos no escopo do arquivo.

Neste caso eles são somente leitura ao meu ver, já que são imutáveis 
depois do constructor, a antes do destructor e não o tempo tempo.

Já um objeto  sem storage, poderia ser classificado como imutável.
por exemplo

int main()
{
constexp int i = 1; 

Se não for pego o endereço de i, &i, o storage de i não precisa existir.
Neste caso o i poderia ser imutável mesmo no escopo de função.
No  entanto, dizer que i é um objeto imutável é estranho pois i não  é um 
objeto no sentido que ele não tem storage. Seria melhor chamá-lo de 
valor nomeado.



Reply all
Reply to author
Forward
0 new messages