C++primer Capítulo 6 Funciones

Capítulo 6 Funciones

  • 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
      1. Inicializar los parámetros formales correspondientes a la función con parámetros reales
      1. 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:
        1. devuelve el valor en la declaración de devolución
        1. 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
void print(int (*matrix)[10],int rowSize){
    
    ...}//matrix指向含有10个整数的数组的指针
void print(int matrix[][10],int rowSize){
    
    ...}//与上式等价

6.2.5 principal: procesamiento de opciones de línea de comando

//argc表示数组中字符串的数量 argv是一个数组它的元素是指向C风格字符串的指针
int main(int argc,char *argv[]){
    
    ...}
//与上式等效 其中argv指向cahr* argv的第一个元素指向程序的名字或者一个空字符串
//接下来的元素依次传递命令行提供的实参 最后一个指针之后的元素值保证为0
int main(int argc,char **argv){
    
    ...}

6.2.6 Funciones con parámetros variables

  • 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
      1. 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
      1. Coincidencias logradas por conversiones constantes
      1. Coincidencia de implementaciones de promoción de tipo
      1. Conversión de tipos aritméticos/conversión de punteros
      1. 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
bool (*pf)(const string&,const string&);
//pf前有一个*,故pf为指针,右侧为形参列表,表示pf指向的是函数,左侧函数返回值是布尔值
//pf指向一个形参是两个const string的引用,返回类型是bool的函数
//*pf两端的括号不可少,不加括号的话则pf是一个返回值为bool指针的函数
  • utilizando punteros de función
    • 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
//Func和Func2是函数类型
//调用Func作为参数时编译器自动将Func表示的函数类型转换为指针
typedef bool Func(const string&,const string&);
typedef decltype(lengthCompare) Func2;//与上式等价
//FuncP和FuncP2是指向函数的指针
typedef bool (*FuncP)(const string&,const string&);
typedef decltype(lengthCompare) *FuncP2;//与上式等价
//decltype返回函数类型,不会自动将函数类型转换为指针类型,只有在结果前面加*才能得到指针
  • puntero de retorno a la función
    • 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

Supongo que te gusta

Origin blog.csdn.net/m0_68312479/article/details/128603726
Recomendado
Clasificación