Pergunta

Eu gosto de usar estática funções em C++ como uma forma de classificá-los, como C# faz.

Console::WriteLine("hello")

Isso é bom ou ruim?Se as funções são usadas, muitas vezes, eu acho que não importa, mas se não eles colocam pressão sobre a memória?

O que sobre static const?

Foi útil?

Solução

mas isso é bom ou ruim

O primeiro adjetivo que vem à mente é "desnecessária".C++ oferece funções livres e espaços de nomes, então, por que você precisa para torná-los funções estáticas em uma classe?

O uso de métodos estáticos em uninstantiable classes em C# e Java é uma solução porque as línguas não tem funções (isto é, funções que residem diretamente no espaço de nomes, em vez de como parte de uma classe).C++ não tem essa falha.Basta utilizar um espaço de nomes.

Outras dicas

Eu sou tudo para utilizar estático funções.Estes só fazem sentido especial quando organizadas em módulos (static class em C#).

No entanto, o momento essas funções precisam de algum tipo de apoio externo (não em tempo de compilação const) de dados e, em seguida, que a função deve ser feito de um método de instância e encapsulados junto com seus dados em uma classe.

Em poucas palavras:funções estáticas ok, dados estáticos ruim.

Aqueles que dizem funções estáticas podem ser substituídos por espaços de nomes são de errado, aqui está um exemplo simples:

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

Como você pode ver, a função pública estático f1 chama outro estático, mas privado de função f2.

Este não é apenas um conjunto de funções, mas uma coleção smart com seus próprios métodos encapsulados.Namespaces não iria nos dar esta funcionalidade.

Muitas pessoas usam o "singleton" padrão, apenas porque é uma prática comum, mas em muitos casos você precisa de uma classe com vários métodos estáticos e apenas um membro de dados estáticos.Neste caso, não há necessidade de um singleton em tudo.Também chamar o método instance() é mais lento do que o simples acesso a funções estáticas/membros diretamente.

Use espaços de nomes para fazer uma coleção de funções:

namespace Console {
    void WriteLine(...) // ...
}

Como para a memória, funções de utilizar a mesma quantidade de fora de uma função, como uma função de membro estático ou em um espaço de nomes.O que é:não há memória do que o próprio código.

Uma razão específica de dados estáticos é ruim, é que o C++ não dá qualquer garantia sobre a ordem de inicialização de objetos estáticos em diferentes unidades de tradução.Na prática, isto pode causar problemas quando um objeto depende de outro, em uma tradução diferente da unidade.Scott Meyers discute isso no Item 26 do seu livro Mais Eficaz do C++.

Concordo com o Frank aqui, não há um problema com a estática (global) funções (claro, desde que sejam organizadas)..Os problemas só começam realmente fluência em quando as pessoas pensam "ah, eu só vou fazer o âmbito de aplicação este bit de dados um pouco maior"..Ladeira escorregadia :)

Para colocá-lo realmente em perspectiva.. Programação Funcional ;)

O problema com funções estáticas é que eles podem levar a uma concepção que quebra o encapsulamento.Por exemplo, se você encontrar-se escrever algo como:

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

...então você talvez precise repensar seu projeto.Funções estáticas, muitas vezes, exigem o uso de setters e getters que a desordem de uma Classe da API e torna as coisas mais complicadas em geral.No meu exemplo, pode ser melhor para remover Hamburger, getters e apenas mover o getTotal() da classe em Hambúrguer em si.

Eu tendem a tornar as aulas que consistem em funções estáticas, mas alguns dizem que o "caminho certo" para fazer isso é, geralmente, para utilizar espaços de nomes em vez disso.(Eu desenvolvi a minha hábitos antes de C++ teve espaços de nomes.)

BTW, se você tem uma classe que consiste apenas de dados estáticos e funções, você deve declarar o construtor de ser privado, de modo que ninguém tenta instanciar.(Este é um dos motivos de alguns argumentam utilizar espaços de nomes em vez de classes.)

Para a organização, utilize espaços de nomes como já foi referido.

Para dados globais gosto de usar o singleton padrão porque ele ajuda com o problema do desconhecido ordem de inicialização de objetos estáticos.Em outras palavras, se você usar o objeto como um singleton é garantido para ser inicializado quando o seu usado.

Também certifique-se de que suas funções estáticas são apátridas, de modo que eles são thread-safe.

Eu costumo usar apenas estática, em conjunto com o sistema do amigo.

Por exemplo, eu tenho uma classe que usa um monte de (entre linhas) auxiliar interno de funções para calcular coisas, incluindo operações em dados privados.

Isso, é claro, aumenta o número de funções a interface de classe tem.Para livrar-se de que, eu declarar uma classe auxiliar em classes originais .arquivo cpp (e, portanto, invisível para o mundo exterior), torná-lo um amigo da classe original e, em seguida, mover-se as antigas funções do auxiliar em estática (inline) funções de membro da classe auxiliar, passando a antiga classe por referência, além de parâmetros antigos.

Isso mantém a interface magro e não requer uma grande listagem de higiene funções de amigo.Inlining também funciona muito bem, então eu não sou completamente contra estática.(Eu evitá-lo o máximo que eu posso, mas usando-a como este, eu gostaria de fazer.)

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