Na marcação C ++, uma função de membro const
significa que ela pode ser chamada em const
instâncias. Java não tem um equivalente a isso. Por exemplo:
class Foo {
public:
void bar();
void foo() const;
};
void test(const Foo& i) {
i.foo(); //fine
i.bar(); //error
}
Os valores podem ser atribuídos, uma vez, posteriormente em Java, por exemplo:
public class Foo {
void bar() {
final int a;
a = 10;
}
}
é legal em Java, mas não em C ++, enquanto que:
public class Foo {
void bar() {
final int a;
a = 10;
a = 11; // Not legal, even in Java: a has already been assigned a value.
}
}
Tanto em Java quanto em C ++, as variáveis de membro podem ser final
/ const
respectivamente. Eles precisam receber um valor no momento em que uma instância da classe termina de ser construída.
Em Java, eles devem ser definidos antes da conclusão do construtor, isso pode ser alcançado de uma de duas maneiras:
public class Foo {
private final int a;
private final int b = 11;
public Foo() {
a = 10;
}
}
No C ++, você precisará usar as listas de inicialização para fornecer aos const
membros um valor:
class Foo {
const int a;
public:
Foo() : a(10) {
// Assignment here with = would not be legal
}
};
Em Java, final pode ser usado para marcar as coisas como não substituíveis. C ++ (pré-C ++ 11) não faz isso. Por exemplo:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Mas em C ++:
class Bar {
public:
virtual void foo() const {
}
};
class Error: public Bar {
public:
// Fine in C++
virtual void foo() const {
}
};
isso é bom, porque a semântica de marcar uma função de membro const
é diferente. (Você também pode sobrecarregar tendo apenas const
uma das funções de membro. (Observe também que o C ++ 11 permite que as funções de membro sejam marcadas como finais, consulte a seção de atualização do C ++ 11)
Atualização do C ++ 11:
De fato, o C ++ 11 permite marcar classes e funções-membro como final
, com semântica idêntica ao mesmo recurso em Java, por exemplo, em Java:
public class Bar {
public final void foo() {
}
}
public class Error extends Bar {
// Error in java, can't override
public void foo() {
}
}
Agora pode ser escrito exatamente em C ++ 11 como:
class Bar {
public:
virtual void foo() final;
};
class Error : public Bar {
public:
virtual void foo() final;
};
Eu tive que compilar este exemplo com um pré-lançamento do G ++ 4.7. Observe que isso não substitui const
nesse caso, mas aumenta, fornecendo o comportamento semelhante ao Java que não foi visto com a palavra-chave C ++ equivalente mais próxima. Portanto, se você quisesse que uma função membro fosse ambas final
e const
você faria:
class Bar {
public:
virtual void foo() const final;
};
(A ordem de const
e final
aqui é obrigatória).
Anteriormente, não havia um equivalente direto de const
funções-membro, embora tornar as funções não- virtual
seria uma opção em potencial, sem causar um erro no tempo de compilação.
Da mesma forma que o Java:
public final class Bar {
}
public class Error extends Bar {
}
torna-se em C ++ 11:
class Bar final {
};
class Error : public Bar {
};
(Anteriormente, os private
construtores eram provavelmente o mais próximo possível disso em C ++)
Curiosamente, para manter a compatibilidade com versões anteriores ao código pré-C ++ 11 final
não é uma palavra-chave da maneira usual. (Pegue o exemplo trivial e legal do C ++ 98 struct final;
para ver por que torná-lo uma palavra-chave quebraria o código)
final int a; a = 10; a = 11;
não é (sendo esse o objetivo definal
um modificador de variável). Além disso, os membros finais de uma classe só podem ser configurados no momento da declaração ou uma vez em um construtor. .final
decorador da função de membro para esse propósito exato. O VC ++ 2005, 2008 e 2010 já tem isso implementado, usando a palavra-chave contextual emsealed
vez definal
.Em Java, a palavra-chave final pode ser usada para quatro coisas:
Uma coisa importante é: Uma variável de membro final Java deve ser definida exatamente uma vez! Por exemplo, em um construtor, declaração de campo ou intializador. (Mas você não pode definir uma variável de membro final em um método).
Outra consequência de tornar uma variável de membro final está relacionada ao modelo de memória, o que é importante se você trabalhar em um ambiente encadeado.
fonte
Um
const
objeto pode chamar apenasconst
métodos e geralmente é considerado imutável.Um
final
objeto não pode ser definido como um novo objeto, mas não é imutável - não há nada que impeça alguém de chamar qualquerset
método.Java não possui uma maneira inerente de declarar objetos imutáveis; você precisa criar a classe como imutável.
Quando a variável é um tipo primitivo,
final
/const
trabalha da mesma maneira.fonte
Java final é equivalente a C ++ const em tipos de valores primitivos.
Nos tipos de referência Java, a palavra-chave final é equivalente a um ponteiro const ...
fonte
Você já tem ótimas respostas aqui, mas um ponto que parecia valer a pena acrescentar:
const
no C ++ é comumente usado para impedir que outras partes do programa alterem o estado dos objetos. Como foi apontado,final
no java não é possível fazer isso (exceto os primitivos) - apenas impede que a referência seja alterada para um objeto diferente. Mas se você estiver usando aCollection
, poderá impedir alterações nos seus objetos usando o método estáticoIsso retorna uma
Collection
referência que fornece acesso de leitura aos elementos, mas lança uma exceção se forem tentadas modificações, tornando-o um pouco comoconst
em C ++fonte
O Java
final
funciona apenas em tipos e referências primitivas, nunca nas próprias instâncias de objetos em que a palavra-chave const funciona em qualquer coisa.Comparar
const list<int> melist;
comfinal List<Integer> melist;
o primeiro torna impossível modificar a lista, enquanto o último apenas impede que você atribua uma nova listamelist
.fonte
Além de ter certas e sutis propriedades multithreading , as variáveis declaradas
final
não precisam ser inicializadas na declaração!isto é válido em Java:
Isso não seria válido se escrito com C ++ 's
const
.fonte
De acordo com a wikipedia :
fonte
Eu acho que ele diz "aproximadamente" porque o significado de
const
em C ++ fica complicado quando você fala sobre ponteiros, ou seja, ponteiros constantes versus ponteiros para objetos constantes. Como não há ponteiros "explícitos" em Java,final
não há esses problemas.fonte
Deixe-me explicar o que entendi com um exemplo de instrução switch / case.
Os valores em cada instrução de caso devem ser valores constantes em tempo de compilação do mesmo tipo de dados que o valor do comutador.
declare algo como abaixo (no seu método como instâncias locais ou na sua classe como variável estática (adicione estática a ele então) ou uma variável de instância.
e
Este código não será compilado, se
color1
for uma variável de classe / instância e não uma variável local. Isso será compilado secolor1
definido como estático final (então se tornará variável final estática).Quando não é compilado, você receberá o seguinte erro
fonte
A palavra-chave "const" significa que sua variável é salva na ROM (com microprocessador). no computador, sua variável é salva na área RAM para o código Assembly (RAM somente leitura). isso significa que sua variável não está na RAM gravável: memória estática, memória de pilha e memória de pilha.
A palavra-chave "final" significa que sua variável é salva na RAM gravável, mas você percebe no compilador que sua variável é alterada apenas uma vez.
Eu acho que "const" é ruim no desempenho, então o Java não o usa.
fonte