Espacio de nombres, parámetros predeterminados, sobrecarga de funciones, referencia


 
 
 

1. Espacio de nombres:

Un espacio de nombres define un nuevo alcance y todo el contenido dentro de él se limita a ese espacio de nombres.

El propósito de esto: evitar conflictos de nombres o contaminación de nombres .

Cómo se define el espacio de nombres :

  1. Común:
namespace N
{
	int a;
	int ADD(int left, int right)
	{
		return left + right;
	}
}
  1. Definición anidada:
namespace N
{
	int a;
	int ADD(int left, int right)
	{
		return left + right;
	}
	namespace N1
	{
		int a;
		int ADD(int left, int right)
		{
			return left + right;
		}
	}
}
  1. En el mismo archivo, hay varios espacios de nombres con el mismo nombre, y el compilador eventualmente se fusionará en un solo espacio de nombres
namespace N
{
	int a;
	int ADD(int left, int right)
	{
		return left + right;
	}
}
namespace N
{
	int c;
	int d;
}

Nota: El tercer método es el mismo espacio de nombres, escrito en diferentes ubicaciones, y eventualmente se fusionará, y no puede haber la misma variable o nombre de función (los tipos de parámetros son exactamente los mismos). De lo contrario, se producirá una redefinición .

Uso del espacio de nombres:

  1. Operador de alcance ::usando:, N::变量/函数
    como:N::c;
  2. El uso de using N(命名空间名):: 变量/函数
    determinadas variables o funciones, tales casos para un espacio de nombres de uso frecuente, se puede utilizar directamente como tal. De esta manera, la variable se convierte en una "variable global" en el archivo actual y la función se puede llamar directamente en todo el proyecto.
    Como:
using N::ADD;// ②
using N::a;

int main()
{
	N::c;//①
	return 0;
}
  1. Use using namespace N(命名空间);
    la variable o función del espacio de nombres se puede usar con bastante frecuencia. Todos los ámbitos de miembros en el espacio de nombres se consideran el rol global del archivo.

 
 
 

2. Parámetros predeterminados:

El parámetro predeterminado es especificar un valor predeterminado para el parámetro al declarar o definir una función . Cuando se llama a la función, si no se especifica el parámetro real, se usa el valor predeterminado; de lo contrario, se usa el parámetro real especificado .

Tipo de parámetro predeterminado:

  1. Parámetros predeterminados completos: todos los parámetros de función tienen valores predeterminados.
int ADD(int first = 1, int second = 2, int third = 3)
{
	return first + second + third;
}
  1. Parámetros semi-predeterminados: solo algunos parámetros de función tienen valores predeterminados.
int ADD(int first, int second, int third = 3)
{
	return first + second + third;
}

Nota:

  1. Los parámetros semi-predeterminados se deben dar de derecha a izquierda .
  2. Los parámetros predeterminados no pueden aparecer en la declaración y definición de la función al mismo tiempo .
  3. El valor predeterminado debe ser una constante o una variable global

Se puede dar solo en la declaración y definición de la función. Si aparece repetidamente, aparecerá la redefinición de los parámetros predeterminados .

En general, se recomienda que los valores predeterminados de los parámetros predeterminados se proporcionen en la declaración de función.

3. Sobrecarga de funciones:

Sobrecarga de funciones : en C ++, varias funciones del mismo nombre con funciones similares se declaran en el mismo ámbito . Las listas de parámetros formales (tipos de parámetros, número de parámetros, orden de parámetros) de estas funciones con el mismo nombre son diferentes.

Diferentes manifestaciones de la lista de parámetros:

  1. El número de parámetros es diferente: las siguientes dos funciones con el mismo nombre, con diferente número de parámetros, constituyen una sobrecarga de funciones.
int ADD(int right, int left)
{
	return right + left;
}

int ADD()
{
	return 10;
}
  1. Diferentes tipos de parámetros : Las siguientes dos funciones con el mismo nombre tienen diferentes tipos de parámetros, lo que constituye una sobrecarga de funciones.
int ADD(int right, int left)
{
	return right + left;
}

double ADD(double right,double left)
{
	return right + left;
}
  1. El orden de los tipos de parámetros es diferente : el orden de los tipos de parámetros es diferente para las siguientes dos funciones con el mismo nombre, lo que constituye una sobrecarga de funciones.
double ADD(int right, double left)
{
	return right + left;
}

double ADD(double right, int left)
{
	return right + left;
}

Tal código:

int ADD(int right, int left)
{
	return right + left;
}

double ADD(double right, double left)
{
	return right + left;
}

int main()
{
	ADD(1, 2.2);
	return 0;
}

¿Qué tipo de errores aparecerán en este código?

En el proceso de llamada a la función, se instanciarán los parámetros formales, pero no hay un tipo de coincidencia completo . Conversión de tipo implícito será ocurrir . int->double 或者double->intEscriba, pero en la llamada anterior, encontrará que se pueden realizar ambas conversiones. El compilador no sabe cuál elegir. Producirá un error.

Informe de errores en VS2017:
Inserte la descripción de la imagen aquí
este error se denomina ambigüedad | ambigüedad.

Principio de llamada de sobrecarga de funciones: determine a qué función llamar en la etapa de compilación

  1. En la etapa de compilación, el compilador deduce el tipo y encuentra la función que coincide con el tipo de acuerdo con el resultado de la deducción a llamar.
  2. Si hay una función con un tipo completamente coincidente , llámala directamente.
  3. Si no hay ninguna función cuyo tipo coincida exactamente , se realiza una conversión de tipo implícita .
  4. Si hay una función correspondiente ( sin ambigüedad ) después de la conversión de tipo implícita, se llama.
  5. Si no hay ambigüedad o no, se informará un error .

Por lo tanto, cuando se ejecuta ADD (1, 2.2), ocurren ambigüedad, múltiples conversiones y errores del compilador.

El tipo de valor de retorno de la función es diferente y no constituye una sobrecarga de función.

int ADD(int right, int left)
{
	return right + left;
}

double ADD(int right, int left)
{
	return right + left;
}

Esto no constituye una sobrecarga de funciones.

¿Por qué el lenguaje C no admite la sobrecarga de funciones? ¿Y C ++ admite la sobrecarga de funciones?

Eche un vistazo en el entorno VS:

int ADD(int right, int left);

int main()
{
	ADD(1, 2);
	return 0;
}

Si no hay una definición de función, se informa de un error.
En C ++, el error es:
Inserte la descripción de la imagen aquí
En lenguaje C, el error es: El
Inserte la descripción de la imagen aquí
código anterior es el mismo, pero el compilador usa nombres diferentes en la parte inferior al compilar.

Lenguaje C: simplemente agregue un _
C ++ al nombre de la función: interprete el nombre de la función como ?ADD@@YAHHH@Z.
Si en C ++, el tipo de valor de retorno es double, el tipo de parámetro es double, ¿cuál es el nombre de la función?
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

 
 
 
Echemos un vistazo a cómo es en el entorno Linux:
C ++:
Inserte la descripción de la imagen aquí
Lenguaje C:
Inserte la descripción de la imagen aquí
Puedes ver que en lenguaje C, la modificación de funciones es relativamente simple. C ++ es más específico para la decoración de funciones. En Linux, incluye la longitud del nombre de la función y la primera letra del tipo de parámetro de función.

Por lo tanto, el lenguaje C no admite la sobrecarga de funciones, ya que modifica las funciones de manera relativamente simple, si hay funciones con el mismo nombre, se producirá una redefinición. En C ++, los tipos de parámetros de función también se modifican. Diferentes listas de parámetros de funciones con el mismo nombre tienen diferentes descripciones subyacentes.

 
 
 

¿Cuál es la diferencia entre el lenguaje C y la función C ++?

  1. Tipo de valor devuelto:

En lenguaje C: la función no tiene un tipo de valor de retorno y el sistema devuelve el tipo int por defecto.
C ++: Necesita traer el tipo de valor de retorno. De lo contrario, el programa informa de un error.

  1. Parámetros de función:

En lenguaje C: la función no tiene parámetros, pero al llamar, se pasan los parámetros y el compilador puede compilarlos.
En C ++, la función no tiene parámetros, cuando se llama, los parámetros se pasan y el compilador no puede compilarlos.

  1. Los parámetros de la función C ++ pueden tener valores predeterminados: los parámetros predeterminados
  2. Las reglas de denominación de funciones son diferentes: C ++ admite la sobrecarga de funciones, pero el lenguaje C no admite

El compilador de C ++ tiene una detección de sintaxis más estricta que el compilador de lenguaje C.
 
 
 
 

4. Cita:

La referencia es un alias para la variable actual existente . El compilador no abrirá espacio para la referencia , pero comparte un espacio de memoria con la variable referenciada.
Inserte la descripción de la imagen aquí
Las variables de referencia y referenciadas comparten el mismo espacio de memoria.
Si se cambian los datos, la variable referenciada también cambiará.

El tipo de referencia debe ser coherente con el tipo de variable.

Nota citada:

  1. Debe inicializarse al definir . Es decir, especifique la variable a la que se hará referencia.
  2. Una variable puede tener varias referencias. Es decir, una entidad tiene varios alias.
  3. Después de hacer referencia a una entidad, no se puede hacer referencia a otras entidades.

Cuando se hace referencia a una constante, también se debe agregar const y la entidad no se puede modificar por referencia.

int main()
{
	double d = 12.56;
	const int& rd = d;
	return 0;
}

El código anterior se puede citar correctamente. Pero habrá problemas:
Inserte la descripción de la imagen aquí

¿Por qué es esto?
La variable de referencia será coherente con el tipo de entidad de referencia. Hay una conversión de tipo implícita entre double e int, y double se convierte en int.
rd se refiere ad, el compilador crea un espacio temporal como una transición, sea rd para referirse a este espacio temporal.
Pero la dirección de este espacio no se conoce en circunstancias normales y no se puede modificar. Entonces este espacio tiene constancia (características constantes).
rd es equivalente a citar una constante. Debe agregar una constante.

 
 
Escenarios de aplicación referenciados:

  1. Mantenga el código conciso.
  2. Hacer parámetros de función.
  3. Hacer función de valor de retorno.

Preste atención al valor de retorno de la función:

  1. Si el objeto devuelto se ha devuelto al sistema, no se puede devolver por referencia. De lo contrario, se devuelve un área ilegal.
  2. Si el objeto devuelto no se devuelve al sistema, se puede utilizar la devolución por referencia.

Comparación de la función pasando por valor y pasando por referencia: pasar por referencia es mucho más rápido que pasar por valor, porque no hay un proceso de instanciación de parámetros formales por referencia, y los parámetros formales son solo un alias de la entidad, lo que reduce la sobrecarga causada por el apilamiento de parámetros, por lo que Mucho mas rápido.

Comparación de función pasando por puntero y pasando por referencia: la eficiencia de las dos es similar.

void Swap(int& right, int& left)
{
	int tmp = right;
	right = left;
	left = tmp;
}

void Swap(int *right, int *left)
{
	int tmp = *right;
	*right = *left;
	*left = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);

	Swap(&a, &b);
	return 0;
}

Desmontarlo:
Inserte la descripción de la imagen aquí
comprobó que las operaciones realizadas por los dos códigos son las mismas. Las referencias se manejan a modo de punteros.

Se implementa mediante operaciones de referencia y punteros en la parte inferior.

La diferencia entre referencia y puntero:

  1. Desde un punto de vista conceptual:
    Referencia: es un alias de una variable, el compilador no le abrirá espacio. Referencias y entidades comparten un espacio.
    Puntero: el compilador le asignará espacio y el puntero apunta a la dirección.
  2. Desde el nivel inferior: no hay diferencia entre referencias y punteros-las referencias son punteros
  3. Desde el punto de vista característico:

1. La referencia debe inicializarse y no se requiere el puntero
2. Una vez que se hace referencia a la entidad, no se puede hacer referencia a otras entidades. El puntero puede apuntar a cualquier dirección que esté de acuerdo con el tipo.
3. No hay una referencia NULL, pero hay un puntero NULL.
4. En sizeof, el resultado de la referencia es el tamaño del tipo de referencia, y el puntero siempre es de 4 bytes en una plataforma de 32 bits.
5. Referenciado desde Agregue 1 a la entidad más 1, y el puntero agrega 1 al tamaño de su tipo.
6. Hay punteros de varios niveles, pero no hay una referencia de varios niveles.
7. Al acceder a la entidad, es necesario desreferenciar el puntero y la referencia se puede usar directamente.
8. Relación de referencia Los punteros son relativamente más seguros

Supongo que te gusta

Origin blog.csdn.net/w903414/article/details/108714494
Recomendado
Clasificación