estático em diferentes idiomas
-
03-07-2019 - |
Pergunta
Ouvi dizer que há diferenças entre idiomas sobre o significado da palavra-chave static
, mas não encontrei uma boa lista que consolide essas diferenças.
Aqui está o que eu sei sobre o significado de static
em C++:
- Para variáveis estáticas locais dentro de uma função, a variável é inicializada na inicialização e o valor é salvo nas chamadas de função.
- Membros de dados estáticos são compartilhados entre todas as instâncias de uma classe.Em outras palavras, existe apenas uma instância de um membro de dados estáticos.Os membros de dados estáticos devem ser inicializados no escopo do arquivo.
- Funções de membros estáticos têm acesso apenas a membros estáticos.
- No código recursivo, é garantido que um objeto ou variável estática tenha o mesmo estado em diferentes instâncias de um bloco de código.
- Objetos estáticos e variáveis definidas no escopo do arquivo possuem apenas ligação interna.Nenhum outro arquivo pode usá-los.
Como o significado de static
mudar em outros idiomas?
Solução
C
- A palavra-chave pode alterar a ligação ou a duração (vida útil) de um objeto.
- Variáveis são sempre inicializadas em 0
- As funções têm ligação interna.
- Se declarado no escopo de nível de arquivo:variáveis têm ligação interna e duração estática (ou seja,existe durante toda a vida do programa)
- Se declarado no escopo do bloco:variáveis não têm ligação, mas duração estática
- Podem existir múltiplas declarações da mesma variável estática em uma unidade de tradução.No entanto, observe que eles devem ser iguais.Por exemplo:no escopo de nível de arquivo:
int a; // a has external linkage
static int a; // a now has static linkage
// same as if you wrote: static int a = 0;
//...
static int b; // static linkage
extern int b; // extern loses its meaning, b still has internal linkage
//...
extern int b; // b has external linkage
static int b; // error
//...
void func() {
static int x; // automatic linkage, static duration
// same as if you wrote: static int x = 0;
}
C++
- No escopo do nível de arquivo, o uso foi descontinuado para variáveis e membros em favor de namespaces anônimos.Existe apenas como compatibilidade
- As variáveis ainda são inicializadas por padrão (como em C) como 0
- "6.7 A inicialização zero (8.5) de todos os objetos locais com duração de armazenamento estático (3.7.1) ou duração de armazenamento de thread (3.7.2) é realizada antes de qualquer outra inicialização ocorrer [...]"
- As variáveis têm duração de armazenamento estático, a menos que sejam acompanhadas por um
thread_local
especificador (de C++0x em diante) - Só pode haver uma definição de estático em uma unidade de tradução
- Variáveis/funções de membros significam que são propriedades da classe e não a sintaxe de acesso legal de instâncias:instance.property ou Class::property
- As funções de membro estático podem acessar apenas variáveis estáticas para membros não
this
ponteiro para tais funções - No entanto, membros não estáticos podem acessar qualquer membro estático
- No nível do arquivo, os objetos possuem ligação interna, exceto os membros da classe que possuem um escopo de classe
- Os membros da classe precisam ser definidos na declaração da classe ou fora explicitamente por meio do nome da classe e do operador de resolução de escopo
- Não pode usar
this
em um método estático
ActionScript
- Métodos de classe como em C++
- não pode usar
this
ousuper
em um método estático - Acessado apenas através do nome da classe e não do nome da instância
- Não herdado
- As classes derivadas, entretanto, têm acesso às propriedades estáticas das bases
- Variáveis declaradas com palavras-chave static e const devem ser inicializadas ao mesmo tempo que você declara a constante
Design Orientado a Objetos
- O padrão de design Singleton é considerado por muitos como um objeto estático glorificado
- Usado no padrão de design de fábrica
Posso ter perdido muitas outras coisas - fique à vontade para contribuir.
Outras dicas
No Delphi, a palavra-chave static é usada exclusivamente para definir métodos de classe.Em Delphi um normal O método de classe pode ser declarado virtual e substituído em uma subclasse.Além disso, o Delphi possui um auto variável, semelhante ao esse ponteiro em outras línguas.No entanto, em um método de classe, o auto aponta para a classe na qual o método é chamado em vez de uma instância.
Declarando um método de classe estático significa:
- Não pode ser substituído em uma subclasse
- Não tem um auto ponteiro
Isso significa que um método de classe estático só pode acessar membros de classe na classe em que foi definido, enquanto um método de classe normal pode acessar membros de classe substituídos em classes derivadas.
Existem outros usos informais de static na documentação do Delphi, geralmente referindo-se à imutabilidade de um recurso (isso é uma palavra?).Por exemplo, uma matriz estática versus uma matriz dinâmica.Todos os métodos de instância no Delphi são estáticos, a menos que seja declarado o contrário.
Em VB.NET, um Static
variável é como uma variável estática local C++.
No entanto, não existe uma classe Static
;usar Shared
em vez de.
Em C#, existem três maneiras de usar uma palavra-chave estática:
- Na definição da classe, o que significa que a classe exporá apenas membros estáticos e não poderá ser instanciada
- Em um membro da classe, o que significa que o membro pode ser chamado sem a necessidade de instanciar a classe.
- Em um construtor, o que significa que o construtor estático sempre será chamado antes de um membro estático ser chamado.(Esses são principalmente gargalos de desempenho e, portanto, não recomendados)
Espero que isto ajude.
Em C#, isso sempre significa:"relacionado a um tipo e não a uma instância do tipo".
Python possui o decorador @staticmethod, que quando aplicado a um membro da classe, disponibiliza o método na classe em vez de instâncias e não passa argumentos automáticos para o método.O decorador @classmethod executa uma função semelhante, mas passa a classe como primeiro argumento, tornando-a muito mais útil.
Em C, static sinaliza uma função ou variável global como local para o arquivo em que está localizada.
É como se fosse privado em outras línguas.Mais ou menos.
Se estiver em uma função, static pré-aloca essa variável na seção de dados do binário, em vez de na pilha em tempo de execução.
No VB.NET, estático é usado no nível do procedimento para significar que a variável está associada a todas as execuções do procedimento (é preservada de chamada para chamada).No entanto, esse é um uso um tanto misterioso em um aplicativo orientado a objetos.
A contraparte é "Compartilhada", o que significa que o método ou membro é de nível de tipo (você não precisa de uma instância para acessá-lo).
A Wikipedia resume muitos significados diferentes de static
:
Métodos estáticos, variáveis estáticas, digitação estática.