2011-10-13 25 views
5

Duplicar posible:
Namespace + functions versus static methods on a classC++ - Espacio de nombres vs. funciones estáticas

Quiero funciones similares Togther grupo. Puedo hacerlo de dos maneras. Para mí, son solo diferencias sintácticas ... al final no importa. ¿Es esta vista precisa?

Espacio de nombres:

namespace util 
    { 
    void print_array(int array[]) 
    { 
    int count = sizeof(array)/sizeof(array[0]); 
    for (int i = 0; i <= count; i++) cout << array[i]; 
    } 
    } 

Clase:

class Util 
    { 
    public: 
    static void print_array(int array[]) 
     { 
     int count = sizeof(array); 
     for (int i = 0; i <= count; i++) cout << array[i]; 
     } 
    }; 

llamada con

Util::print_array() // Class 

o

util::print_array() // Namespace 
+1

Tuvimos esta discusión recientemente. Con suerte, alguien publicará un enlace. Los espacios de nombres están sujetos a ADL, mientras que las clases no son; las clases pueden ser modeladas, mientras que los espacios de nombres no pueden. –

Respuesta

5

La segunda forma es tonta y una completa tontería. Las clases no son espacios de nombres, y nunca deben usarse como tales.

Además, el código es incorrecto, sizeof(array) no devolverá lo que piensas.

+0

Las clases pueden ser modeladas, sin embargo. –

+2

@KerrekSB: Funciones, también. El beneficio es la especialización parcial, pero si usted sabe acerca de eso, no está haciendo preguntas tontas como esta. –

+0

Lo suficiente :-) –

2

hay algunas diferencias en que la segunda forma le permite hacer un par de cosas (sin sentido) que el primer camino no:

  • Utilizando la segunda manera se puede crear instancias de Util utilizando Util foo; o Util* foo = new Util();.
  • También puede usar Util como un parámetro de tipo para plantillas (o en cualquier otro lugar donde se permiten nombres de tipo). Entonces podrías, por ejemplo, crear un vector<Util>.
  • También puede calcular el tamaño de instancias de Util utilizando sizeof(Util).

Dado que no hay ninguna razón por la que desee poder hacer cualquiera de estas cosas, debe usar la primera. En general, casi siempre debes reconsiderar el uso de una clase cuando no haya circunstancias en las que desees crear una instancia.

En una nota relacionada: En su código sizeof(array) es equivalente a sizeof(int*) y casi con toda seguridad no se haga lo que crea que hace (es decir, no lo hace te dice cuántos elementos hay en la matriz).

Cuestiones relacionadas