Рубрики

Функции, которые не могут быть перегружены в C ++

В C ++ следующие объявления функций не могут быть перегружены.

1) Объявления функций, которые отличаются только типом возвращаемого значения. Например, следующая программа завершается неудачно при компиляции.

#include<iostream>

int foo() { 

  return 10; 

}

  

char foo() { 

  return 'a'

}

  

int main()

{

   char x = foo();

   getchar();

   return 0;

}

2) Объявления функций-членов с тем же именем и именем-type-type-list имени не могут быть перегружены, если любое из них является объявлением статической функции-члена. Например, следующая программа завершается неудачно при компиляции.

#include<iostream>

class Test {

   static void fun(int i) {}

   void fun(int i) {}   

};

  

int main()

{

   Test t;

   getchar();

   return 0;

}

3) Объявления параметров, которые отличаются только указателем * и массивом [], эквивалентны. То есть объявление массива корректируется, чтобы стать объявлением указателя. Только второе и последующие измерения массива имеют значение для типов параметров. Например, следующие два объявления функций эквивалентны.

int fun(int *ptr);

int fun(int ptr[]); // переобъявление веселья (int * ptr)

4) Объявления параметров, которые отличаются только тем, что один является типом функции, а другой является указателем на тот же тип функции, являются эквивалентными.

void h(int ());

void h(int (*)()); // переопределение h (int ())

5) Объявления параметров, которые отличаются только наличием или отсутствием const и / или volatile, эквивалентны. То есть спецификаторы const и volatile для каждого типа параметра игнорируются при определении, какая функция объявлена, определена или вызвана. Например, следующая программа завершается неудачно при компиляции с ошибкой «переопределение` int f (int) '«

Пример:

#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;

}

Только const и volatile спецификаторы типа на самом внешнем уровне спецификации типа параметра игнорируются таким образом; Спецификаторы типа const и volatile, скрытые в спецификации типа параметра, имеют большое значение и могут использоваться для различения объявлений перегруженных функций. В частности, для любого типа Т,
«Указатель на T», «указатель на const T» и «указатель на volatile T» считаются различными типами параметров, как и «ссылка на T», «ссылка на const T» и «ссылка на volatile T». пример, см. пример в этом комментарии, опубликованном Venki.

6) Два объявления параметров, отличающиеся только аргументами по умолчанию, эквивалентны. Например, следующая программа завершается с ошибкой компиляции с ошибкой «переопределение` int f (int, int) '«

#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;

}

Ссылки:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Функции, которые не могут быть перегружены в C ++

0.00 (0%) 0 votes