Funciones#
Introducción#
Las funciones son un componente fundamental de la programación de C++, empaquetando fragmentos de código en secciones de código reutilizables y eficientes diseñadas para realizar una tarea específica. Las funciones se pueden llamar varias veces dentro de un programa, lo que facilita la organización del código y ayuda a evitar la repetición del código. Las funciones también hacen que el código sea más fácil de depurar.
Esta página cubre los conceptos básicos del uso de funciones en C++, que incluyen:
Estructura y sintaxis de funciones: cómo se escriben las funciones en C++, incluidos los tipos, nombres y parámetros de retorno.
Prototipos de funciones — Qué son las funciones prototipo y por qué se utilizan.
Definición y llamada de funciones — Cómo crear funciones y llamarlas desde tu programa.
Devolver valores: cómo las funciones pueden enviar datos a la persona que llama.
Pasar por referencia — Cómo las funciones pueden modificar variables fuera de su propio alcance.
Funciones de devolución de llamada: cómo se pueden pasar funciones a otras funciones y llamar automáticamente en respuesta a eventos.
Funciones con argumentos predeterminados — Cómo se pueden dar valores predeterminados a los parámetros cuando no se proporciona ningún argumento.
Estructura y sintaxis de las funciones#
En C++, las funciones deben declararse con su tipo de retorno, nombre y parámetros. La sintaxis básica es:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Piezas de función |
Descripción |
|---|---|
|
El tipo de datos que devuelve la función, algunas opciones comunes son:
|
|
El nombre de la función. |
|
Opcional. Una lista separada por comas de parámetros escritos como nombre de |
|
Opcional. El valor devuelto por la función. Si el |
Nota: Una función debe declararse siempre antes de que se llame, o debe proporcionar un prototipo de función.
Prototipos de funciones#
En C++, el código se lee de arriba a abajo. Esto significa que el compilador debe conocer una función antes de poder llamarla.
Un prototipo de función te permite usar una función antes de escribir su código completo. Esto le permite mantener main() cerca de la parte superior de su programa mientras coloca las definiciones de función más adelante, donde son más fáciles de organizar y leer.
Sin un prototipo, tendrías que definir todas las funciones por encima de main(), lo que puede hacer que los proyectos sean más difíciles de seguir a medida que crecen.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
void greeting() {
Brain.Screen.print("Hello!");
}
Definición y funciones de llamada#
Functions with No Parameters#
Si una función no requiere entrada, puede definirla sin parámetros. Utilice void como tipo de retorno si la función no devuelve un valor.
// Define a function to display a message
void greeting() {
Brain.Screen.print("Hello!");
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Call the function to display the message
greeting();
}
Functions with Parameters#
También puede agregar parámetros a las funciones, que le permiten pasar información para que la función la use.
Nota: El texto se puede pasar usando cadenas de estilo C (const char*) o cadenas C++ (std::string).
// Define a function with a parameter
void namedGreeting(const char* name) {
Brain.Screen.print("Hello, %s!", name);
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
namedGreeting("Stranger");
}
Valores de devolución#
Las funciones pueden enviar datos a la persona que llama utilizando la palabra clave return. Esto le permite capturar y utilizar el resultado en su proyecto.
// Define a function that multiplies numbers by 2
int timesTwo(int number) {
return number * 2;
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the return value
Brain.Screen.print("%d", timesTwo(2));
}
Paso por Referencia#
De forma predeterminada, C++ pasa los parámetros de la función por valor, lo que significa que la función recibe una copia de la variable original. Los cambios realizados dentro de la función no afectan el valor original.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
Para permitir que una función modifique la variable original, los parámetros se pueden pasar por referencia utilizando el símbolo &.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will now be 6
}
Pasar por referencia permite que las funciones actualicen variables definidas fuera de la función sin devolver un valor.
Funciones de devolución de llamada#
Una función de devolución de llamada es una función que se pasa a otra función y se llama automáticamente cuando ocurre un evento específico.
Las devoluciones de llamada se utilizan comúnmente para eventos como pulsaciones de botones o actualizaciones de sensores.
En lugar de llamar a la función usted mismo, el proyecto la llama cuando ocurre el evento.
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
Brain.Screen.pressed(onPressed);
}
Callback Signatures#
Cada función de devolución de llamada debe seguir una firma específica, que define:
El tipo de devolución
El número de parámetros
Los tipos de parámetros
La API determina la firma requerida. La función de devolución de llamada debe coincidir exactamente con esta firma.
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
Los nombres de los parámetros son descriptivos y pueden variar, pero el tipo de retorno, el orden de los parámetros y los tipos de parámetros deben coincidir exactamente.
Funciones con argumentos predeterminados#
Las funciones pueden definir valores predeterminados para uno o más parámetros. Se utiliza un argumento predeterminado cuando no se proporciona ningún valor para ese parámetro cuando se llama a la función.
Reglas para los argumentos predeterminados:
Los argumentos predeterminados deben ser los últimos parámetros en la definición de la función.
Una vez que un parámetro tiene un valor predeterminado, todos los parámetros posteriores también deben tener valores predeterminados.
Si una función especifica argumentos predeterminados en su prototype, esos valores predeterminados no deben especificarse nuevamente en la definición de la función.
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (V5) and
// use default value for repeatCount (1)
greeting("V5");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("V5", 3);
}