Definición y declaración de función (pase de parámetro de función/valor de retorno/sobrecarga (coincidencia de llamada)/puntero de función)
la función denominada bloque de código puede tener 0/múltiples parámetros generalmente producen un resultado puede sobrecargarse
6.1 Fundamentos de funciones
Definición de función: un tipo de devolución, un nombre de función, una lista de 0 o más parámetros formales y un cuerpo de función
Operador de llamada: El operador de llamada tiene la forma de un par de paréntesis, que actúa sobre una expresión, que es una función o un puntero a una función. Dentro de los paréntesis hay una lista de parámetros reales separados por comas. Los parámetros del función de inicialización
función de escritura
Funciones de llamada
Inicializar los parámetros formales correspondientes a la función con parámetros reales
transferir el control a la función llamada
La ejecución de la función de llamada se interrumpe y la función llamada comienza a ejecutarse
declaración de devolución:
devuelve el valor en la declaración de devolución
Transferir el control de la función llamada a la función que llama
parámetros formales y parámetros reales
El parámetro real es el valor inicial del parámetro formal (no se especifica el orden de evaluación de los parámetros reales)
El tipo del parámetro actual debe coincidir con el tipo del parámetro formal correspondiente (elemento de argumento)
lista de parámetros de función
Puede estar vacío pero no omitirse
Los parámetros en la lista de parámetros están separados por comas y cada parámetro es una declaración con un declarador
Cualquier parámetro formal no puede tener el mismo nombre, y las variables locales en el ámbito más externo de la función no pueden tener el mismo nombre que el parámetro formal.
El nombre del parámetro formal es opcional, pero se debe proporcionar un parámetro real.
tipo de retorno de función
El tipo de retorno no puede ser un tipo de matriz o un tipo de función, pero puede ser un puntero a una matriz o una función
6.1.1 Objetos locales
Alcance del nombre: la parte del texto del programa en la que se ve el nombre
Ciclo de vida del objeto: el período de tiempo que existe un objeto durante la ejecución del programa
Variables locales: parámetros y variables definidos dentro del cuerpo de la función (ocultarán todas las demás declaraciones con el mismo nombre en el ámbito externo)
objeto automático
Variables locales ordinarias como parámetros formales
objeto estático local
tipo estático: hace que el ciclo de vida de las variables locales se ejecute a través de la llamada de función y el tiempo posterior
Si no hay un valor inicial explícito, realice la inicialización del valor Las variables estáticas locales de tipo integrado se inicializan en 0
6.1.2 Declaración de función
La declaración de función (también conocida como prototipo de función) no requiere un cuerpo de función (no hay nombres de parámetros formales)
Tres elementos de una función: tipo de retorno/nombre de función/tipo de parámetro
declaración de función en el archivo de encabezado
Declaración del archivo de encabezado, definición del archivo de origen, el archivo de origen incluye el archivo de encabezado, el compilador verifica que la definición de la función coincida con la declaración
6.1.3 Compilación separada
Al escribir un programa, divídalo según la relación lógica y compile cada archivo de forma independiente
compilar y vincular múltiples archivos fuente
$: símbolo del sistema; CC: nombre del compilador; #: declaración de comentario bajo la línea de comando
Si se modifica uno de los archivos fuente, simplemente vuelva a compilar el archivo modificado para generar el archivo .o/.obj (este archivo contiene código objeto)
El compilador es responsable de vincular los archivos de objetos para formar un ejecutable.
6.2 Paso de parámetros
Cada vez que se llama a la función, sus parámetros formales se recrearán e inicializarán con los parámetros reales entrantes (el mecanismo de inicialización es el mismo que el de la inicialización de variables)
Pasar por referencia/pasar por referencia: el parámetro formal es un tipo de referencia, que estará ligado al parámetro actual correspondiente (el parámetro formal de referencia es el alias del parámetro actual correspondiente)
Valor/pasar por valor: el parámetro formal y el parámetro real son dos objetos independientes, y el valor del parámetro real se copia en el parámetro formal
6.2.1 Parámetros de paso por valor
Inicialización de variables de tipo sin referencia El valor inicial se copia a la variable y los cambios en la variable no afectarán el valor inicial
parámetro de puntero
El comportamiento del puntero es el mismo que el de otros tipos que no son de referencia: al realizar una copia del puntero, el valor del puntero se copia y los dos punteros después de la copia son punteros diferentes (pero las direcciones a las que apuntan son las mismas)
Los programadores de C a menudo usan parámetros de tipo de puntero para acceder a funciones de objetos externos, y C++ recomienda usar parámetros de tipo de referencia en lugar de punteros.
6.2.2 Parámetros de paso por referencia
La operación sobre la referencia en realidad actúa sobre el objeto al que hace referencia la referencia.
Usa referencias para evitar copiar
Cuando un determinado tipo no admite operaciones de copia, solo se pueden usar parámetros de referencia para acceder a objetos de este tipo
Si no hay necesidad de cambiar el contenido del objeto de parámetro formal, se puede definir como una referencia a una constante (cuando la función no necesita modificar el valor del parámetro formal de referencia, es mejor declararlo como un referencia constante)
Usar parámetros de referencia para devolver información adicional
La devolución de varios resultados puede definir un nuevo tipo de datos que contiene varios miembros
Pasar argumentos de referencia adicionales a la función
6.2.3 parámetros constantes y parámetros reales
Al igual que otras inicializaciones, la constante de nivel superior se ignora cuando el parámetro formal se inicializa con un parámetro real. Cuando el parámetro formal tiene una constante de nivel superior, se puede pasar a un objeto constante o no constante. (Debido a que se ignora la const de nivel superior, cuando la función está sobrecargada, los parámetros formales con o sin la const de nivel superior son los mismos, y no se puede realizar dicha sobrecarga)
apuntador o parámetro de referencia const
Los parámetros se inicializan de la misma manera que se inicializan las variables
consejo:
Una referencia no constante no se puede inicializar con un valor literal (pero se puede inicializar una referencia constante)
no se puede vincular una referencia normal a un objeto const
no se puede vincular una referencia simple a un literal
Utilice referencias constantes siempre que sea posible
El uso de referencias en lugar de referencias constantes limita en gran medida los tipos de argumentos que una función puede aceptar
Por ejemplo, no puede pasar objetos const/valores literales/objetos que requieren conversión de tipo a objetos de referencia ordinarios
6.2.4 Parámetros de matriz
Propiedades especiales de matriz
No se permite la copia de matrices
Cuando se usa una matriz, generalmente se convierte en un puntero (un puntero al primer elemento de la matriz)
Sin embargo, los parámetros formales se pueden escribir en forma de matriz, como pero (const int[])/(const int[10])al final los únicos parámetros formales son(const int*)
El tamaño de la matriz no tiene efecto en la llamada a la función (pero asegúrese de no salirse de los límites cuando use la matriz). Dado que la matriz se pasa a la matriz en forma de puntero, la función no conoce el tamaño de la matriz y la persona que llama debe proporcionar información adicional para esto.
Tres técnicas comunes para gestionar parámetros de puntero
Use banderas para especificar la longitud de la matriz
Aplicable a situaciones en las que hay una etiqueta final obvia y la etiqueta no se confundirá con datos ordinarios, como un carácter nulo al final de una cadena de estilo C
Utilice la especificación de la biblioteca estándar
Pase punteros al primer y último elemento de la matriz (begin end)
Pase explícitamente un parámetro formal que represente el tamaño de la matriz
Determine el número de elementos de la matriz a través de parámetros formales, como el número puede serend(j)-begin(j)
Parámetros de matriz y const
Cuando la función no necesita realizar operaciones de escritura en los elementos de la matriz, el parámetro de la matriz debe ser un puntero a const
Solo cuando la función realmente necesite cambiar el valor del elemento, defina el parámetro formal como un puntero a una no constante
parámetro de referencia de matriz
C++ permite que las variables se definan como referencias a arreglos, y los parámetros formales también pueden ser referencias a arreglos (los (int (&arr)[10])corchetes en ambos extremos del nombre del arreglo son esenciales)
El tamaño de la matriz es parte del tipo de matriz, siempre que la dimensión no exceda el cuerpo de la función, la matriz se puede usar de manera segura
pasar matriz multidimensional
Las matrices multidimensionales son en realidad matrices de matrices
Al pasar una matriz multidimensional a una función, lo que en realidad se pasa es un puntero al primer elemento de la matriz.
El tamaño de la segunda dimensión de la matriz (y todas las dimensiones posteriores) es parte del tipo de matriz y no se puede omitir
Todos los argumentos son del mismo tipo y un initializer_listtipo de biblioteca estándar llamado
Escriba un tipo especial de función, plantillas variádicas, si los tipos de argumentos son diferentes
Tipo de parámetro especial: puntos suspensivos, se puede pasar un número variable de parámetros reales
initializer_listrecuerdo
Se desconoce el número de argumentos, pero todos los argumentos tienen el mismo tipo
Una matriz utilizada para representar valores de un cierto tipo
Es un tipo de plantilla pero los elementos en el objeto son siempre valores constantes y no pueden modificar el valor de los elementos del objeto
initializer_listContiene miembros iniciales y finales, puede usar el rango para bucle | | initializer_listOperaciones proporcionadas | |-----|-----| | initializer_list<T> lst;| Inicialización predeterminada; Tlista vacía de elementos de tipo | | initializer_list<T> lst{a,b,c...};| lstEl número de elementos es el igual que el valor inicial muchos; lstlos elementos de la lista son copias de los valores iniciales correspondientes; los elementos de la lista son const. | | lst2(lst)| Copiar o asignar un initializer_listobjeto no copia los elementos de la lista; después de copiar, la lista original y la copia comparten elementos | | | - | | | el lst2 = lstnúmero de lst.size()elementos de la lista | | lst.begin()| devuelve lstun puntero a la primer elemento en | | | un puntero a la siguiente posición del microelemento |lst.end()lst
parámetro de puntos suspensivos
Es conveniente que los programas C++ accedan a algunas configuraciones especiales de código C, estos códigos usan las funciones de biblioteca estándar de C llamadas varags
Solo aplicable a tipos comunes de c y c ++, la mayoría de los objetos de tipo de clase no se pueden copiar correctamente al pasar parámetros formales de puntos suspensivos
Un parámetro de puntos suspensivos solo puede aparecer en la última posición de la lista de parámetros
Los parámetros formales de puntos suspensivos no requieren verificación de tipo
6.3 Tipo de devolución y declaración de devolución
La declaración de retorno finaliza la función que se está ejecutando actualmente y devuelve el control al lugar donde se llamó a la función.
dos formas return;yreturn expression;
6.3.1 Funciones sin valor de retorno
Solo se puede usar para funciones cuyo tipo de devolución es void. Una función que devuelve void no requiere devolución porque la última oración de este tipo de función ejecutará implícitamente la devolución.
Si sale temprano en medio de la función void, puede usar return
Si la declaración de retorno de una función cuyo tipo de retorno es void tiene una expresión, debe ser otra función que devuelva void
6.3.2 Funciones con valores de retorno
Siempre que el valor de retorno de la función no sea nulo, return debe devolver un valor, el tipo de valor de retorno debe ser el mismo o se puede convertir implícitamente al tipo de retorno de la función
También debe haber una declaración de devolución después del ciclo que contiene la declaración de devolución
cómo se devuelve el valor
devolver un valor exactamente de la misma manera que inicializar una variable o parámetro
No devolver referencias o punteros a objetos locales.
La terminación de la función significa que las referencias a variables locales apuntarán a áreas de memoria que ya no son válidas
Funciones y operadores de llamadas que devuelven tipos de clase
El operador de llamada tiene la misma precedencia que los operadores de punto y flecha, y también se deja asociativo
referencia devuelve un lvalue
Llamar a una función que devuelve una referencia obtiene un valor l, otros tipos de devolución obtienen un valor r
Una llamada a una función que devuelve una referencia se puede usar como cualquier otro valor l y puede asignar un valor al resultado de una función cuyo tipo de devolución es una referencia no constante, que no se puede asignar al resultado de una llamada si el tipo de retorno es una referencia constante
valor de retorno del inicializador de lista
Una función puede devolver una lista de valores entre llaves, que se utiliza para inicializar el valor temporal que representa el retorno de la función.
Si la lista está vacía, el temporal realiza la inicialización del valor; de lo contrario, el valor devuelto está determinado por el tipo de retorno
Si la función devuelve un tipo integrado, la lista rodeada por llaves contiene como máximo un valor y el espacio ocupado por el valor no debe ser mayor que el espacio del tipo de destino; si el tipo devuelto es un tipo de clase, la clase misma define cómo se usa el valor inicial
El valor de retorno de la función principal main
La función principal puede terminar directamente sin una declaración de retorno, y el control llega al final sin una declaración de retorno. El compilador insertará implícitamente una declaración de retorno que devuelve 0
El archivo de encabezado cstdlib define dos variables de preprocesamiento, que indican el éxito y el fracaso. Debido a que es una variable de preprocesamiento, std:: no se puede agregar al frente, ni puede aparecer en la declaración de uso.
EXIT_FAILURE
SALIR_ÉXITO
recursión
Una función se llama a sí misma, debe haber una ruta que no contenga llamadas recursivas
bucle recursivo
Una función sigue llamándose a sí misma hasta que se agota el espacio de la pila del programa
la función principal no puede llamarse a sí misma
6.3.3 Devolver un puntero de matriz
Las matrices no se pueden copiar, por lo que las funciones no pueden devolver matrices, pero se pueden devolver punteros o referencias a matrices.
Los punteros o referencias que devuelven matrices se pueden simplificar utilizando alias de tipo
Declarar una función que devuelve un puntero de matriz
Para definir una función que devuelve un puntero de matriz, la dimensión de la matriz debe seguir al nombre de la función
La lista de parámetros formales de la función también sigue al nombre de la función y la lista de parámetros formales debe preceder a la dimensión de la matriz.
Type(*function(parameter_list))[dimension]
usar el tipo de retorno final
sigue la lista de parámetros formales y ->comienza con un símbolo
comoauto func(int i)->int(*)[10]
usar tipo de declaración
Sabiendo a qué matriz apuntará el puntero devuelto por la función, puede usar la palabra clave decltype para declarar el tipo de retorno
decltype no es responsable de convertir el tipo de matriz en el puntero correspondiente, por lo que el resultado de decltype es una matriz Para indicar el puntero de retorno, debe agregar un * cuando la declaración de la función
6.4 Sobrecarga de funciones
Varias funciones en el mismo alcance tienen el mismo nombre pero diferentes listas de parámetros
El compilador inferirá la función deseada en función del tipo de parámetro real pasado
La función principal no se puede sobrecargar
Definir funciones sobrecargadas
La función sobrecargada difiere en el número de parámetros formales o los tipos de parámetros formales
No se permite que dos funciones sean idénticas en todos los aspectos excepto en el tipo de retorno
Determinar si los tipos de dos parámetros formales son diferentes
El nombre del parámetro formal solo se usa como mnemotécnico y si no afecta el contenido de la lista de parámetros formales
El uso de alias de tipo no es esencialmente diferente para las listas de parámetros formales.
Parámetros de sobrecarga y const
La const de nivel superior no afecta el objeto pasado a la función (un parámetro con const de nivel superior es indistinguible de otro parámetro sin const de nivel superior)
Si el parámetro formal es cierto tipo de puntero o referencia, la sobrecarga de funciones se puede realizar distinguiendo si apunta a un objeto constante o no constante.En este momento, const es la capa inferior. El compilador puede inferir qué función debe llamarse si el parámetro real es una constante
const no se puede convertir a otros tipos, pero no const se puede convertir a const. Al pasar un objeto no constante o un puntero a un objeto no constante, el compilador dará preferencia a la versión no constante de la función.
Ya sea para sobrecargar la función depende de cuál es más fácil de entender
const_cast y sobrecarga
Cuando el parámetro real no es una constante, el parámetro real primero se convierte en una referencia a const, y luego se llama a la versión const de la función.La versión const devuelve una referencia al tipo const, que en realidad está vinculado a un valor inicial parámetro real no constante, por lo que se puede convertir de nuevo a un tipo normal y que es seguro
llamar a función sobrecargada
Coincidencia de funciones/determinación de sobrecarga: asocie una llamada de función con una de un conjunto de funciones sobrecargadas (diferente cantidad de parámetros/tipos de parámetros independientes)
Hay tres posibilidades para sobrecargar las funciones:
mejor partido
Sin coincidencia: no se encontró ninguna función que coincida con los argumentos de la llamada
Llamadas ambiguas: más de una función puede coincidir, cada una de las cuales no es la mejor opción obvia
6.4.1 Sobrecarga y alcance
Si un nombre se declara en un ámbito interno, ocultará las entidades del mismo nombre declaradas en ámbitos externos. No se puede sobrecargar el nombre de la función en un ámbito diferente
Una vez que el nombre requerido se encuentra en el alcance, el compilador ignora la entidad del mismo nombre en el alcance externo y luego verifica si la llamada a la función es válida.
la búsqueda de nombres de C++ ocurre antes de la verificación de tipos
6.5 Funciones de lenguaje de propósito especial
Características del lenguaje relacionadas con funciones: argumentos predeterminados/funciones en línea/funciones constexpr
6.5.1 Argumentos predeterminados
Argumento predeterminado: Se le da el mismo valor en muchas llamadas de la función.Al llamar a una función con un argumento predeterminado, el argumento se puede incluir u omitir.
Se pueden definir uno o más parámetros formales para definir valores predeterminados. Una vez que se asigna un valor predeterminado a un parámetro formal, todos los parámetros formales posteriores deben tener valores predeterminados.
Llamar a una función con argumentos predeterminados
Simplemente omita el parámetro real al llamar a la función
Los parámetros reales de la llamada de función se analizan por posición, y los parámetros reales predeterminados son responsables de completar los parámetros finales faltantes de la llamada de función.
Establezca razonablemente el orden de los parámetros formales, de modo que los parámetros formales que no usan el valor predeterminado a menudo aparezcan al frente y los parámetros formales que a menudo usan el valor predeterminado aparezcan al final.
declaración de argumento por defecto
A un parámetro formal solo se le puede asignar un argumento predeterminado una vez en un ámbito determinado, y las declaraciones posteriores de la función solo pueden agregar argumentos predeterminados a los parámetros formales que no tienen valores predeterminados antes, y todos los parámetros formales a la derecha del parámetro formal debe tener valores predeterminados
Normalmente, los argumentos predeterminados deben especificarse en la declaración de la función, y la declaración debe colocarse en el archivo de encabezado apropiado
Valor inicial del argumento predeterminado
Las variables locales no se pueden usar como argumentos predeterminados. De lo contrario, se puede usar una expresión como parámetro predeterminado siempre que el tipo de expresión se pueda convertir al tipo requerido por el parámetro formal.
Los nombres utilizados como argumentos predeterminados se resuelven en el ámbito de la declaración de la función y la evaluación se produce cuando se llama a la función.
6.5.2 Funciones en línea y funciones constexpr
Beneficios de definir como una función:
Fácil de leer y entender
garantizar la uniformidad del comportamiento
Modificar funciones es más fácil que expresiones equivalentes
se puede reutilizar
defecto:
Las funciones son más lentas que evaluar expresiones de equivalencia
Las llamadas a funciones incluyen:
Los registros se guardan antes de la llamada y se restauran al regresar
Puede necesitar copiar argumentos
El programa va a una nueva ubicación para continuar la ejecución.
Las funciones en línea evitan la sobrecarga de las llamadas a funciones
en línea Deje que la función se expanda en línea en el sitio de la llamada para eliminar la sobrecarga del tiempo de ejecución de la función
Una función en línea es solo una solicitud al compilador, que el compilador puede optar por ignorar
El mecanismo de alineación se utiliza para optimizar funciones a pequeña escala, de flujo directo y llamadas con frecuencia.
Muchos compiladores no admiten funciones recursivas en línea
función constexpr
Para funciones usadas en expresiones constantes, el tipo de devolución y los tipos de todos los parámetros formales deben ser tipos de valor literal, y solo hay una declaración de devolución en el cuerpo de la función.
Las funciones constexpr se especifican implícitamente como funciones en línea
Una función constexpr no necesariamente devuelve una expresión constante
Ponga funciones en línea y funciones constexpr en archivos de encabezado
Las funciones en línea y las funciones constexpr se pueden definir varias veces en el programa, pero las definiciones múltiples deben ser completamente consistentes, generalmente definidas en el archivo de encabezado
6.5.3 Ayuda de depuración
Protección de archivos de encabezado, etc. El programa puede contener algún código para la depuración, pero solo se usa durante el desarrollo y se protege durante el lanzamiento. Dos funciones de preprocesamiento: afirmar y NDEBUG
afirmar macro de preprocesamiento
Los nombres de preprocesamiento son administrados por el preprocesador en lugar del compilador, y los nombres de preprocesamiento se pueden usar directamente sin proporcionar una declaración de uso. Al igual que las variables del preprocesador, los nombres de las macros deben ser únicos dentro de un programa.
assert(expr)afirmar genera un mensaje y finaliza la ejecución del programa si la expresión es falsa, o no hace nada si la expresión es verdadera
La macro de afirmación se usa a menudo para verificar condiciones que no pueden ocurrir
Variable de preprocesamiento NDEBUG
Si se define NDEBUG, la afirmación no hace nada; si no se define NDEBUG, la afirmación realizará una verificación de tiempo de ejecución
#define NDEBUGDesactive el estado de depuración usando
Defina su propio código de depuración, si NDEBUG no está definido, ejecute #ifndef和#endifel código intermedio; si NDEBUG está definido, estos códigos se ignorarán
definición del compilador c++
_ _func_ _nombre de la función
Nombres útiles para la depuración del programa de definición del preprocesador
_ _FILE_ _literal de cadena de nombre de archivo
_ _LINE_ _literal entero del número de línea actual
_ _TIME_ _literales de cadena en tiempo de compilación
_ _DATE_ _literal de cadena de fecha de compilación
6.6 Coincidencia de funciones
Cómo determinar la función sobrecargada cuando el número de parámetros de la función es igual y el tipo de algunos parámetros se puede convertir de otros tipos
Identificar funciones candidatas y funciones factibles
Función candidata: mismo nombre que la función llamada; declaración visible en el sitio de la llamada
Función factible: el número de parámetros formales es igual al número de parámetros reales proporcionados esta vez; el tipo de cada parámetro real es el mismo que el tipo del parámetro formal o se puede convertir al tipo del parámetro formal
Si no se encuentra una función viable, el compilador no informará ningún error de función coincidente
encontrar la mejor coincidencia
Verifique los parámetros reales proporcionados por la función uno por uno y encuentre la función factible cuyo tipo de parámetro formal coincida mejor con el tipo de parámetro real
Cuanto más cerca estén los tipos de parámetros reales, mejor será la coincidencia; una coincidencia exacta es mejor que una coincidencia que requiere conversión de tipo
coincidencia de funciones con múltiples parámetros
El compilador selecciona una función cuyo número de parámetros formales cumple con los requisitos y cuyo tipo de parámetro real y tipo de parámetro formal pueden coincidir, y verifica cada parámetro real a su vez para determinar qué función es la mejor coincidencia. cumple con los siguientes requisitos, la coincidencia es exitosa
La coincidencia de cada argumento de la función no es peor que la requerida por otras funciones factibles
Hay al menos un argumento cuya coincidencia es superior a la proporcionada por otras funciones factibles
Al llamar a la sobrecarga, debe intentar evitar la conversión de tipo obligatoria y la racionalidad del diseño de parámetros formales
6.6.1 Conversión de tipo de parámetro real
Nivel de conversión de tipo de argumento a parámetro
coincidencia exacta
El tipo de parámetro real es el mismo que el tipo de parámetro formal
Un argumento se convierte de un tipo de matriz o función al tipo de puntero correspondiente
Agrega const de nivel superior a un argumento o elimina const de nivel superior de un argumento
Coincidencias logradas por conversiones constantes
Coincidencia de implementaciones de promoción de tipo
Conversión de tipos aritméticos/conversión de punteros
conversión de tipo de clase
Partidos que requieren promociones de tipo y conversiones de tipo aritmético
Los enteros pequeños se promueven para escribir int o tipos enteros más grandes
La llamada es ambigua cuando hay dos posibles conversiones de tipo aritmético
Coincidencia de funciones y argumentos constantes
Al llamar, el compilador decide qué función elegir según si el parámetro real es una constante
no se puede vincular una referencia normal a un objeto const
Los objetos no constantes se pueden usar para inicializar referencias constantes y referencias no constantes, pero los objetos no constantes requieren una conversión de tipos para inicializar referencias constantes, y la versión no constante de la función se selecciona con el fin de lograr una coincidencia exacta.
6.7 Punteros de función
El puntero de función apunta a un tipo específico, y el tipo de función está determinado por su tipo de valor de retorno y tipo de parámetro formal, y no tiene nada que ver con el nombre de la función.
Para declarar un puntero que pueda apuntar a la función, simplemente reemplace el nombre de la función con el puntero, como en
Las funciones se convierten automáticamente en punteros cuando el nombre de la función se usa como valor
Use directamente el puntero de solo esa función para llamar a la función sin desreferenciar por adelantado
No hay reglas de conversión entre punteros a diferentes tipos de funciones, pero puede asignar un valor de nullptr o 0 a un puntero de función, lo que indica que el puntero no apunta a ninguna función.
puntero a función sobrecargada
El compilador decide qué función usar a través del tipo de puntero, y el tipo de puntero debe coincidir exactamente con una de las funciones sobrecargadas.
parámetro de puntero de función
Aunque los parámetros formales de los tipos de matriz y función no se pueden definir. Pero el parámetro formal puede ser un puntero a una función.
Los parámetros formales parecen tipos de funciones, pero en realidad se usan como punteros.
Puede usar la función directamente como un parámetro real, que se convierte automáticamente en un puntero
Los alias de tipo se pueden utilizar para simplificar el trabajo con punteros a funciones, como
Similar a una matriz, aunque no puede devolver una función, puede devolver un puntero a un tipo de función y el tipo de valor devuelto debe escribirse como un puntero.
A través de los alias de tipo, un símbolo se puede definir como una función o un tipo de puntero a una función.
A diferencia de los parámetros formales del tipo de función, el tipo de devolución no se convierte automáticamente en un puntero y el tipo de devolución debe especificarse explícitamente como un puntero.
Una función que devuelve un puntero de función se puede declarar con un tipo de retorno final
Use auto y decltype para los tipos de puntero de puntero de función
Puede usar decltype para simplificar el tipo de retorno del puntero de función al saber exactamente cuál es la función de retorno
Cuando se aplica decltype a una función, devuelve un tipo de función en lugar de un tipo de puntero, y * debe agregarse explícitamente para indicar que necesitamos devolver un puntero en lugar de la función en sí.
resumen
Funciones: unidades de cálculo con nombre, cruciales para la estructuración del programa
La función contiene: tipo de devolución/nombre/lista de parámetros/cuerpo de la función
Las funciones se pueden sobrecargar: el mismo nombre se puede usar para definir múltiples funciones, siempre que los parámetros o tipos sean diferentes, el compilador seleccionará automáticamente la función llamada
Coincidencia de funciones: elija la mejor función de un conjunto de funciones sobrecargadas
Glosario
Llamadas ambiguas: cuando se compara una función, dos o más funciones proporcionan coincidencias que son igualmente buenas y el compilador no puede encontrar la mejor coincidencia.
Objetos automáticos: Objetos que existen solo durante la ejecución de la función. El objeto se crea cuando el flujo de control del programa pasa a través de tal declaración de definición de objeto y se destruye cuando se alcanza el final del bloque en el que se define.
Prototipo de función: la declaración de función contiene el tipo de retorno/nombre/tipo de parámetro