Funciones que no se pueden sobrecargar en C++

En C++, las siguientes declaraciones de funciones no se pueden sobrecargar. 1) Declaraciones de funciones que difieren solo en el tipo de devolución. Por ejemplo, el siguiente programa falla en la compilación. 

CPP

#include<iostream>
int foo() {
  return 10;
}
 
char foo() {
  return 'a';
}
 
int main()
{
   char x = foo();
   getchar();
   return 0;
}

2) Las declaraciones de funciones miembro con el mismo nombre y el nombre lista de tipos de parámetros no se pueden sobrecargar si alguna de ellas es una declaración de función miembro estática. Por ejemplo, el siguiente programa falla en la compilación. 

CPP

#include<iostream>
class Test {
   static void fun(int i) {}
   void fun(int i) {}  
};
 
int main()
{
   Test t;
   getchar();
   return 0;
}

3) Las declaraciones de parámetros que difieren solo en un puntero * frente a una array [] son ​​equivalentes. Es decir, la declaración de array se ajusta para convertirse en una declaración de puntero. Solo la segunda dimensión de la array y las subsiguientes son significativas en los tipos de parámetros. Por ejemplo, las siguientes declaraciones de dos funciones son equivalentes. 

C

int fun(int *ptr);
int fun(int ptr[]); // redeclaration of fun(int *ptr)

4) Las declaraciones de parámetros que difieren solo en que uno es un tipo de función y el otro es un puntero al mismo tipo de función son equivalentes. 

CPP

void h(int ());
void h(int (*)()); // redeclaration of h(int())

5) Las declaraciones de parámetros que difieren solo en la presencia o ausencia de const y/o volatile son equivalentes. Es decir, los especificadores de tipo const y volatile para cada tipo de parámetro se ignoran al determinar qué función se declara, define o llama. Por ejemplo, el siguiente programa falla en la compilación con el error “redefinición de `int f(int)’” Ejemplo: 

CPP

#include<iostream>
#include<stdio.h>
  
using namespace std;
  
int f ( int x) {
    return x+10;
}
 
int f ( const int x) {
    return x+10;
}
 
int main() {    
  getchar();
  return 0;
}

Solo los especificadores de tipo const y volatile en el nivel más externo de la especificación de tipo de parámetro se ignoran de esta manera; Los especificadores de tipo const y volatile enterrados dentro de una especificación de tipo de parámetro son significativos y se pueden usar para distinguir declaraciones de funciones sobrecargadas. En particular, para cualquier tipo T, «puntero a T», «puntero a T constante» y «puntero a T volátil» se consideran tipos de parámetros distintos, al igual que «referencia a T», «referencia a T constante» y «referencia a T volátil». Por ejemplo, vea el ejemplo en este comentario publicado por Venki. 6) Dos declaraciones de parámetros que difieren solo en sus argumentos predeterminados son equivalentes. Por ejemplo, el siguiente programa falla en la compilación con el error “redefinición de `int f(int, int)’” 

CPP

#include<iostream>
#include<stdio.h>
  
using namespace std;
  
int f ( int x, int y) {
    return x+10;
}
 
int f ( int x, int y = 10) {
    return x+y;
}
 
int main() {    
  getchar();
  return 0;
}

Sobrecarga de funciones y espacios de nombres

Puede sobrecargar funciones en espacios de nombres. Por ejemplo:

C++

#include <iostream>
using namespace std;
 
// Original X.h:
int f(int);
// Original Y.h:
int f(char);
 
// Original program.c:
#include "X.h"
#include "Y.h"
 
int main(){
  f('a');   // calls f(char) from Y.h
}

Los espacios de nombres se pueden introducir en el ejemplo anterior sin cambiar drásticamente el código fuente:

C++

#include <iostream>
using namespace std;
 
i// New X.h:
namespace X {
  f(int);
}
 
// New Y.h:
namespace Y {
  f(char);
}
 
// New program.c:
#include "X.h"
#include "Y.h"
 
using namespace X;
using namespace Y;
 
int main(){
  f('a');   // calls f() from Y.h
}

En program.c, la función principal llama a la función f(), que es miembro del espacio de nombres Y. Si coloca las directivas de uso en los archivos de encabezado, el código fuente de program.c permanece sin cambios.

Referencias: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. .

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *