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?

Foi útil?

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 ou super 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:

  1. Não pode ser substituído em uma subclasse
  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top