1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//Borland C++ 3.1 Перегрузка функций Листинг #1 #include <iostream.h> #include <iostream> using namespace std; //Функция sum void sum(int , int ){ cout << "int, int" << '\n'; } //Функция sum void sum(double , int ){ cout << "double, int" << '\n'; } //Функция sum void sum(double, double){ cout << "double, double" << '\n'; } //Функция main int main() { double a, b; //переменные, уходящие в функцию int c,d; /*ВЫЗОВЫ ФУНКЦИЙ*/ sum(a,b); //double, double sum(a,c); //double, int sum(c,d); //int, int /*КОНЕЦ ВЫЗОВОВ ФУНКЦИЙ*/ cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
//Borland C++ 3.1 Пример полезности перегрузки функций Листинг #2 #include <iostream> using namespace std; /*ФУНКЦИИ, ЧИСТЯЩИЕ ПАМЯТЬ*/ void delete_array(int* &arr, const int N){ delete []arr; } void delete_array(int** &arr, const int ROW, const int COL){ for (int i=0; i<ROW; i++) delete []arr[i]; delete []arr; } /*КОНЕЦ ФУНКЦИЙ, ЧИСТЯЩИХ ПАМЯТЬ*/ //========================================================== /*ФУНКЦИИ, ВЫВОДЯЩИЕ МАССИВЫ НА ЭКРАН*/ void print(int* arr, const int N){ for (unsigned i=0; i<N; i++) cout << arr[i] << ' '; cout << '\n'; } void print(int** arr, const int N, const int M){ for (int i=0; i<N; i++){ for (int j=0; j<M; j++){ cout << arr[i][j] << '\t'; } cout << '\n'; } } /*КОНЕЦ ФУНКЦИЙ, ВЫВОДЯЩИХ МАССИВ НА ЭКРАН*/ //========================================================== //========================================================== /*ФУНКЦИИ, ЗАПОЛНЯЮЩАЯ МАССИВЫ ПЕРВИЧНЫМИ ЗНАЧЕНИЯМИ*/ void fill_array(int* arr, const int N){ for (int i=0; i<N; i++) arr[i] = i+1; } void fill_array(int** arr, const int ROW, const int COL){ unsigned count = 1; for (int i=0; i<ROW; i++){ for (int j=0; j<COL; j++){ arr[i][j] = count++; } } } /*КОНЕЦ ФУНКЦИЙ, ЗАПОЛНЯЮЩИХ МАССИВЫ*/ /*ФУНКЦИИ, ВЫДЕЛЯЮЩИЕ ПАМЯТЬ МАССИВАМ*/ void init(int* &arr, const int N){ arr = new int [N]; } void init(int** &arr, const int ROW, const int COL){ arr = new int* [ROW]; for (int i=0; i<ROW; i++){ arr[i] = new int[COL]; } } /*КОНЕЦ ФУНКЦИЙ, ВЫДЕЛЯЮЩИХ ПАМЯТЬ МАССИВАМ*/ int main(){ const int N = 5; const int ROW = 6, COL = 7; int *arr1; //Указатель на одномерный массив int **arr2; //Указатель на двумерный массив init(arr1,N); //Выделяем массиву память fill_array(arr1,N); //Заполняем массив print(arr1,N); //Печатаем массив на экран delete_array(arr1,N); //Освобождаем память cout << '\n'; init(arr2,ROW,COL); //Выделяем массиву память fill_array(arr2,ROW,COL); //Заполняем массив print(arr2,ROW,COL); //Печатаем массив на экран delete_array(arr2,ROW, COL); //Освобождаем память cin.get(); } |
1 2 3 4 5 6 7 |
//Переопределение функции, код не скомпилируется void foo(int x){} //Две функции с одинаковым описанием void foo(int y){} int main(){ } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> using namespace std; int foo(int x, int y){ return x + y; } double foo(double x, int y){ //Тип y не double! return x + y; } int main(){ double value1 = 100.3; double value2 = 220.3; //100.3 + 220.3 = 320.6 cout << foo(value1, value2); //НО 320.3 cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> using namespace std; int foo(int x, int y){ return x + y; } double foo(double x, int y){ //Тип y не double! return x + y; } double foo(double x, double y){ //Теперь при обоих аргументах с типом double будет работать эта функция return x+y; } int main(){ double value1 = 100.3; double value2 = 220.3; //100.3 + 220.3 = 320.6 cout << foo(value1, value2); //Теперь всё ОК cin.get(); } |
Большое спасибо за доступное изложение материала! 😛
Спасибо!
Код не работает — ошибка: error C2668: ‘sum’ : ambiguous call to overloaded function
насколько я понял, константы 5.0 и 6.0 которые передаются в функции, компилятор определяет как double, а поскольку функии принимающей в параметрах double нет, компилятор пытается преобразовать в другой подходящий тип — int или float, да вот не может выбрать в какой лучше. Если задать хоть один аргумент явно int или float, проблем не будет.
Или опечатка или ошибка — там, где впервые суммируются 100.3 и 220.3 получится 320.3 (220.3 приведется к int=220), а во втором 320.6
Спасибо. Исправил.