[C++] Sobrecarga de la función de entrada de C++

prefacio

En el lenguaje natural, una palabra puede tener múltiples significados y las personas pueden juzgar el verdadero significado de la palabra a través del contexto, es decir, la palabra está sobrecargada.


1. Definición de sobrecarga de funciones

Sobrecarga de funciones : Es un caso especial de funciones. C++ permite que varias funciones con el mismo nombre declaren funciones similares en el mismo ámbito . Estas funciones con el mismo nombre tienen diferentes listas de parámetros formales (número de parámetros o tipos u orden de tipos) , que a menudo se utilizan para tratar de lograr funciones similares pero diferentes tipos de datos. Por ejemplo:

#include<iostream>
using namespace std;

int Add(int left, int right)
{
    
    
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
    
    
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
int main()
{
    
    
	int a = Add(1, 2);
	double b = Add(1.1, 2.2);
	cout << a << endl;
	cout << b << endl;

	return 0;
}

inserte la descripción de la imagen aquí
Podemos ver que se define una función Agregar para calcular la suma de dos tipos diferentes de números.Durante el proceso de llamada, el sistema realizará automáticamente la llamada precisa de acuerdo con los diferentes tipos de sus parámetros.

No solo las funciones se pueden sobrecargar en C++, los operadores también se pueden sobrecargar. Por ejemplo:

Operadores <<,>>. Se puede utilizar como operador de turno, así como operador de entrada y salida.

2. Condiciones para la sobrecarga de funciones

1. Diferentes tipos de parámetros

int Add(int left, int right)
{
    
    
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
    
    
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

2. El número de parámetros es diferente

void f()
{
    
    
	cout << "f()" << endl;
}
void f(int a)
{
    
    
    cout << "f(int a)" << endl;
}

3. El orden de los tipos de parámetros es diferente

void f(int a, char b)
{
    
    
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    
    
	cout << "f(char b, int a)" << endl;
}

Nota: Los tipos de devolución de la sobrecarga de funciones pueden ser iguales o diferentes, solo que los diferentes tipos de devolución no son suficientes para ser funciones sobrecargadas. Porque llamar a una función no necesariamente necesita recibir el valor de retorno

3. El principio de sobrecarga de funciones: manipulación de nombres

¿Por qué C++ admite la sobrecarga de funciones, pero el lenguaje C no admite la sobrecarga de funciones?
En C/C++, para que un programa se ejecute, debe pasar por las siguientes etapas: preprocesamiento, compilación, ensamblaje y vinculación.
inserte la descripción de la imagen aquí
Durante la fase de compilación, el compilador modificará el nombre de la función

  • En el lenguaje C,
    inserte la descripción de la imagen aquí
    debido a que el lenguaje C solo puede simplemente cambiar el nombre de las funciones, el método específico es agregar "_" antes del nombre de la función; por lo tanto, agregar dos funciones con el mismo nombre tendrá el mismo nombre de función después de la compilación, llamar A veces hará una error porque no sabe a cuál llamar, por lo que la sobrecarga de funciones no se admite en lenguaje C.
  • En C++
    , en la fase de compilación, aunque los nombres de función de las dos funciones son los mismos, el compilador modificará sus nombres de función de acuerdo con las condiciones para formar la sobrecarga de funciones , de modo que los nombres generados en la tabla de símbolos sean diferentes.
    Dado que los nombres en las tablas de símbolos generadas por las dos funciones son diferentes en el archivo .cpp, se puede compilar.

Las reglas de modificación de C++ son diferentes en las distintas plataformas. Las reglas de modificación de VS en Windows son algo complicadas, mientras que las reglas de modificación de g++ en Linux son simples y fáciles de entender.

  • Bajo Windows
    inserte la descripción de la imagen aquí
    Add@@YAHHH@Z
    ?Representa el inicio
    Add representa el nombre de la función original
    @@YA representa el inicio del parámetro
    La primera H representa el tipo de valor devuelto int
    La H que sigue representa el parámetro int , la M representa el flotante el parámetro
    @Z representa el nombre Finalizar.

  • bajo linux

inserte la descripción de la imagen aquí
_Z3Addii
_Z representa el comienzo
3 representa la longitud del nombre de la función original
Add representa el nombre de la función original
La primera i representa el primer parámetro es int
La segunda i representa el segundo parámetro es int

Se puede ver que la modificación de función de g++ bajo Linux se convierte en [_Z+longitud de función+nombre de función+iniciales de tipo].

4. Suplemento y Resumen

Polimorfismo: usa la misma cosa para representar diferentes formas; el polimorfismo se divide en:

  • polimorfismo estático (polimorfismo en tiempo de compilación);
  • polimorfismo dinámico (polimorfismo en tiempo de ejecución);

La sobrecarga de funciones es una especie de polimorfismo estático;

Las funciones sobrecargadas generalmente se usan para nombrar un grupo de funciones con funciones similares en el mismo ámbito con el mismo nombre de función, lo que reduce la cantidad de nombres de funciones, evita la contaminación del espacio de nombres y mejora en gran medida la legibilidad del programa. .

Supongo que te gusta

Origin blog.csdn.net/qq_65207641/article/details/128853097
Recomendado
Clasificación