Devido à maneira como os objetos Objective-C funcionam, const
deixa de ser uma aplicação e passa a ser uma notação para o programador. Considere este programa:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Na verdade, isso não será compilado aqui (estou usando o clang): o compilador pode detectar a tentativa de modificar o tipo C primitivo e emitir um erro. Mas agora compare-o com este programa:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
Mesmo que a função passe um ponteiro constante para um objeto constante, ainda é possível alterar o objeto.
Na programação orientada a objetos, a melhor maneira de impor a natureza constante de um objeto é tornar esse objeto imutável - ou seja, não forneça nenhum método que possa alterar seu estado. Imagine que a função acima pegou um NSString
argumento em vez de NSMutableString
, e que eu havia passado a literal em @"Hello"
vez de uma cópia mutável. Agora, razoavelmente falando, não há chance de alterar o objeto passado [*]. Objective-C não tem qualquer maneira de impor que, embora, ao contrário const
ou final
referências de objeto em outras linguagens OO.
Para comparação, const
funciona de maneira totalmente diferente em C ++. Se eu receber uma const
referência a um objeto C ++, só posso chamar const
funções de membro nesse objeto. Essas funções preservam a const
integridade do objeto, não fazendo alterações ou modificando apenas variáveis de membros que foram explicitamente marcadas mutable
pelo designer de classe. Imagine que eu tivesse algum tipo MutableString
em C ++ equivalente a NSMutableString
Objective-C. O equivalente do meu exemplo acima seria algo como:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Definitivamente, isso não será compilado: além de appendString()
não ser uma const
operação, a função remove o const
qualificador da referência de tipo que requer a const_cast
.
[*] Espero que exista alguma maneira distorcida de fazê-lo, mas agora estamos no reino de um programador tentando sabotar outro fazendo coisas "inteligentes".
const
decoração como significativa, para que você obtenha contorções como aliases ou conversões para suprimir avisos, mas não há alterações no comportamento do programa como resultado dessas contorções.const
que ainda poderia ser útil no Objetivo C afirmar que o ponteiro para um objeto nunca é atribuído para apontar para um objeto diferente . Ou seja, comNSString * const x
você sabe quex
sempre será a mesma string e não uma string diferente.No que diz respeito ao objetivo C - eu não programo, portanto não posso responder à pergunta. A pergunta que posso responder é: "As pessoas devem usar
const
muito ao programar no Objetivo C?" - esse é um "sim" definitivo.O Constness é essencialmente um recurso de segurança de software usado para tornar os programas mais confiáveis e sustentáveis. Muitos programadores crescem sem realmente apreciar o valor de
const
s, até que um dia algo ruim acontece e eles têm um momento "Ah ha" - "Ah,const
é para isso que é usado". É perfeitamente possível escrever um programa sem constantes, é praticamente impossível tornar esse programa confiável.Muitas amostras de código não são realmente programas, apenas trechos projetados para mostrar um recurso específico. Eles não usam
const
, pois distraem do ponto que a amostra está tentando fazer. O outro tipo de código que você vê é o código escrito por programadores inexperientes que baseiam o que fazem nos exemplos de que aprenderam ou naqueles que sabem sobre constantes e são preguiçosos demais para usá-los.fonte
Não uso o objetivo-c há muito tempo.
No entanto, eu me pergunto por que nenhum corpo menciona esse aspecto.
O objetivo-c já tem algo mais relacionado à constante. Mutabilidade
Por exemplo, Nstring * apontará para uma seqüência constante. Se você deseja modificar uma string, use NMutableString ou algo parecido. Esse NMutableString fornecerá métodos adicionais que permitem às pessoas modificar a string.
Agora, e se você quiser que o ponteiro em si seja uma constante. Eu nunca preciso me preocupar com isso enquanto codifico um projeto muito grande.
Então eu acho que é por isso.
fonte