2012-05-21 18 views
5

Soy muy nuevo en la programación y estoy confundido acerca de lo que hace el vacío, sé que cuando coloca el vacío delante de una función significa que "no devuelve nada", pero si la función no devuelve nada, ¿cuál es el sentido de escribir el ¿¿función?? De todos modos, tengo esta pregunta en mi tarea y estoy tratando de responderla, pero necesito ayuda con el concepto general. cualquier ayuda sería genial, y por favor intenta evitar la jerga técnica, soy un neófito serio aquí.confusión sobre el vacío y lo que significa.

¿Qué cumple esta función?

void add2numbers(double a, double b) 
    { 
     double sum; 
     sum = a + b; 
    } 
+4

Hay un montón de cosas para una función para hacer, aparte de devolver algo ... –

+4

Te estás perdiendo el concepto de [_side effects_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)) – ildjarn

+0

Esa función no hace nada, y muy probablemente se eliminará cuando se compile –

Respuesta

3

El propósito de una función void es lograr un efecto secundario (por ejemplo, modificar un parámetro de referencia o una variable global, realizar llamadas de sistema tales como I/O, etc.), no devolver un valor.

8
void ReturnsNothing() 
{ 
    cout << "Hello!"; 
} 

Como se puede ver, esta función retorna nada, pero eso no significa que la función hace nada.

Una función no es más que una refactorización del código para juntar rutinas comunes. Si estoy imprimiendo "Hola" a menudo, pongo el código que imprime "Hola" en una función. Si estoy calculando la suma de dos números, pondré el código para hacer eso y devolveré el resultado en una función. Se trata de lo que quieres.

+2

Conozco personas que trabajan con Visual Basic (no VB.NET), y en VB existe una diferencia entre la función y el sub. Para quien se desarrolla en vb sub es una función que no devuelve nada, y cuando devuelve algo, es una función. Tal vez confunde a algunas personas que comienzan a aprender C++ y otros idiomas similares. –

1

Una función con valor de retorno vacío puede ser útil por sus efectos secundarios. Por ejemplo considerar la función de la biblioteca estándar exit:

void exit(int status) 

Esta función no devuelve ningún valor para usted, pero sigue siendo útil por su efecto secundario de terminar el proceso.

1

Esa función no logra nada - pero si lo hubiera escrito

void add2numbers(double a, double b, double &sum) 
{   
    sum = a + b; 
} 

Se le daría la suma, ya que es más fácil devolver un valor o utilizar un parámetro depende de la función

Normalmente lo haría use un parámetro si hay resultados múltiples, pero suponga que tiene una rutina matemática donde una respuesta podría no ser posible.

bool sqrt(double value, double &answer) 
{ 
    if value < 0.0) { 
     return false; 
    } else { 
     answer = real_sqrt_function(value); 
     return true; 
    } 
} 
5

hay un montón de razones para tener funciones vacíos, algunos de ellos están teniendo efectos secundarios 'no puros':

int i=9; 
void f() { 
    ++i; 
} 

En este caso i podría ser global o un miembro de datos de la clase.

El otro es efectos observables

void f() { 
    std::cout <<"hello world" << std::endl; 
} 

Una función de vacío puede actuar sobre un valor de referencia o puntero.

void f(int& i) { 
    ++i; 
} 

También podría arrojar, aunque no lo haga para el control de flujo.

void f() { 
    while(is_not_broke()) { 
     //... 
    } 
    throw std::exception(); //it broke 
} 
1

Estás en la línea correcta: la función no logra nada, porque calcula algo pero luego se descarta.

Las funciones que vuelven vacías pueden ser útiles porque pueden tener "efectos secundarios". Esto significa que sucede algo que no es una entrada o salida de la función. Por ejemplo, podría escribir en un archivo o enviar un correo electrónico.

2

El uso del término función en el contexto de C/C++ es bastante confuso, porque no concuerda con el concepto matemático de una función como "algo que devuelve un valor". Lo que C/C++ llama a las funciones que vuelven vacías corresponde al concepto de un procedimiento en otros idiomas.

La principal diferencia entre una función y un procedimiento es que una llamada de función es una expresión, mientras que una llamada de procedimiento es una declaraciónMientras que las funciones se invocan por su valor de retorno, los procedimientos se invocan por sus efectos secundarios (como producción, cambio de estado, etc.).

1

La función es un poco incorrecta en este caso; quizás llamarlo un método es mejor. Puede llamar a un método en un objeto para cambiar su estado, es decir, los valores de sus campos (o propiedades). Por lo tanto, puede tener un objeto con las propiedades para las coordenadas xey, y un método llamado Mover que toma los parámetros xDelta y yDelta.

Llamar Mover con 2, 3 provocará que se agreguen 2 a su propiedad X y 3 que se agregarán a su propiedad Y. Por lo tanto, el estado del objeto ha cambiado y Musch no tendría sentido para Move haber devuelto un valor.

0

Actualmente uso una biblioteca de visualización llamada VTK. Normalmente escribo funciones vacías para actualizar alguna parte de los gráficos que se muestran en la pantalla. También utilizo funciones nulas para manejar la interacción de la GUI dentro de Qt. Por ejemplo, si hace clic en un botón, parte del texto se actualiza en la GUI.

0

Tiene toda la razón: calcular una función que no devuelve nada no tiene sentido, si se trata de funciones matemáticas. Pero al igual que con muchos conceptos matemáticos, las "funciones" se encuentran en muchos lenguajes de programación solo relacionados con funciones matemáticas, pero se comportan de manera más o menos sutilmente diferente.

Creo que es bueno explicarlo con un lenguaje que no hace no obténgalo mal: uno de esos idiomas es Haskell. Es un lenguaje puramente funcional que significa que una función Haskell también es una función matemática. De hecho, puede escribir las funciones de Haskell mucho más de estilo matemático, por ejemplo.

my_tan(x) = sin(x)/cos(x)   -- or (preferred): tan' x = sin x/cos x 

que en C++

double my_tan(double x) { return sin(x)/cos(x); } 

Sin embargo, en los programas de ordenador que no sólo queremos calcular funciones, ¿verdad? También quiere hacer cosas, como mostrar algo en su pantalla, enviar datos a través de la red, leer valores de sensores, etc. En Haskell, cosas como estas están bien separadas de las funciones puras, todas actúan en el llamado IO mónada. Por ejemplo, la función putStrLn, que imprime una línea de caracteres, tiene el tipo String -> IO().Es decir, toma un String como argumento y devuelve una acción IO que imprime esa cadena cuando se invoca desde la función main, y nada más (los parens () son aproximadamente lo que es void en C++).

Esta forma de hacer IO tiene muchas ventajas, pero la mayoría de los lenguajes de programación son más descuidados: permiten todas las funciones para hacer IO, y también para cambiar el estado interno de su programa. Entonces en C++, simplemente podría tener una función void putStrLn(std::string), que también "devuelve" una acción IO que imprime la cadena y nada más, pero no se lo dice explícitamente. El beneficio es que no necesitas atar nudos múltiples en tu cerebro cuando piensas en qué es realmente la món IO (es más bien indirecta). Además, muchos algoritmos se pueden implementar para que funcionen más rápido si tiene la capacidad de decirle realmente a la máquina "¡Haga esta secuencia de procesos, ahora!" en lugar de solo pedir el resultado de algún cálculo en la mónada IO.

Cuestiones relacionadas