Para mim, o uso da palavra-chave static
em C e idiomas como C # e Java são "falsos amigos", como "tornar-se" em inglês e "bekommen" em alemão (= "obter" em inglês), porque significam coisas diferentes.
Em C static
, significa que a função ou variável é acessível apenas através de funções dentro do mesmo arquivo de origem, comparável a private
funções e membros em C ++, Java e C #.
Em C ++, Java e C # static
significa que os métodos não são membros de uma instância de classe, mas efetivamente são mais ou menos como funções C mais espaço para nome.
IMHO esses dois conceitos são bem diferentes, então por que os designers de C ++ e mais tarde Java e C # escolheram a static
palavra - chave para esse comportamento? Existe uma conexão lógica que eu sinto falta?
EDIT
Eu sei, que static
em C não governa a acessibilidade de maneira semelhante à private
do C ++, mas pode ser usado dessa maneira, consulte https://stackoverflow.com/a/1479639/124983
Notavelmente, o C ++ tem dois usos
static
, e acho que há um terceiro em algum lugar.Geralmente, acho que o uso de C
static
não corresponde a nenhum uso da palavra em inglês, enquanto acho que,static
comostatic
variável de membro, por exemplo, faz muito mais sentido.Lembre-se de que, como designer de linguagem, você tem um incentivo justo para introduzir menos palavras-chave na linguagem, para não permitir menos código, especialmente quando você está tentando ser compatível com C, como em C ++, e a
static
palavra - chave já existia, então eles não conseguiram interromper nenhum programa em C que tentasse compilar como C ++ reutilizando-o.Edit: Eu sabia que havia um terceiro. C possui
static
variáveis no nível da função . Ostatic
membro é apenas uma versão com escopo dessa funcionalidade. Portanto, ambos os usos sãostatic
originários de C.fonte
static
, apenas o escopo de uma classe em vez de uma função.static
ter três usos em C (variável do escopo da função, escopo da unidade de compilação para variáveis, escopo da unidade de compilação para funções). Realmente está fazendo as duas mesmas coisas nesses três casos (vínculo e tempo de vida), eu compartilho sua opinião sobre isso. Infelizmente, a visão de três usos da estática em C é mais comum. Ajuda as pessoas a entender como usá-lo, mas não como ele realmente funciona.No C ++,
static
possui os quatro usos a seguir :Função global (nível de arquivo) e declarações de variáveis : com estático, você está especificando o vínculo interno . Isso significa que o símbolo é usado apenas nessa unidade de compilação (.cpp / cc / qualquer arquivo, não um cabeçalho). É a isso que você está se referindo como "privado".
Variáveis locais : a duração do armazenamento estático especifica que a variável deve reter seu valor entre as chamadas de função.
Membros de dados : os membros de dados estáticos são compartilhados entre as instâncias da classe (ou seja, existe apenas uma cópia do membro). Isso é semelhante ao estático em C # e Java.
Funções de membro: Funções de membro estáticas são funções de membro que não possuem um
this
ponteiro implícito ; eles podem ser chamados sem uma instância. Isso também é muito parecido com C # ou Java.Então, como você pode ver, eles deixaram cair dois dos significados acima. Para o escopo, é bastante compreensível o motivo: tanto o C # quanto o Java (e até o C ++) dependem de espaços para nome para fazer isso. O C ++ provavelmente possui o recurso de ligação interna para compatibilidade com versões anteriores. A exclusão de variáveis locais estáticas é provavelmente dupla: pela primeira vez, pode ser difícil entender completamente suas consequências, e essas linguagens visam a simplicidade. Segundo, Java e C # têm um coletor de lixo que (posso imaginar) causa dificuldades para implementar esse comportamento.
fonte
static
(preferindo espaços de nomes anônimos) e, em seguida, em sua encarnação atual, o C ++ 11 depreciou o usostatic
disso. (all IIRC)O C ++ retirou-o do C, porque o C ++ gosta de reutilizar palavras-chave existentes em vez de introduzir novas, para minimizar a quebra de código existente.
Java e C # então pegaram no C ++.
fonte
C
static
não governa a acessibilidade e não é análogoprivate
da maneira que você sugere.No escopo do arquivo, ele governa a disponibilidade do nome (símbolo do vinculador), não da coisa - você pode passar um ponteiro para uma
static
função ou global da unidade de tradução onde está definido para codificar em outro arquivo e funcionará bem.A maneira C ++ de fazer isso (como DeadMG diz, a maneira C ainda está disponível também) é usar um espaço para nome anônimo.
No escopo da função, essencialmente substitui a variável local por uma global que só é acessível (pelo nome novamente!) Dentro dessa função - isso é idêntico no C ++ (portanto, não há uma maneira mais C ++ de fazê-lo) .
Quanto ao motivo pelo qual o C ++ usou o
static
qualificador para os membros da classe; provavelmente é certo dizer que isso é para minimizar o número de novas palavras-chave introduzidas. (Observe a recente reutilização do auto para comparação).Chamar dados estáticos por classe (tão implicitamente dados por instância são dinâmicos ) parece bastante intuitivo para mim, mas como não me lembro do processo de formação dessa intuição, não posso realmente comentar objetivamente se isso fazia sentido ao iniciar. Fora.
fonte