Форум программистов, компьютерный форум CyberForum.ru

Перегрузка в c++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ задачка на сортировку http://www.cyberforum.ru/cpp-beginners/thread597844.html
есть файл input.txt. \фио \возраст \табелный иванов 30 30 петров 20 45 сидоров 20 10 перепупкин 25 15 нужно чтобы отсортировтаь список работающих по убыванию возраста, для одинакового возраста отсортировать по возрастанию табельного номера. С приминением процедур и функций
C++ Какие самые крутые западные форумы про с++ ? Какие самые крутые западные форумы про с++ ? http://www.cyberforum.ru/cpp-beginners/thread597842.html
C++ Вычислите сумму квадратов всех элементов заданного массива A[N], за исключением элементов, кратных пяти.
Вычислите сумму квадратов всех элементов заданного массива A, за исключением элементов, кратных пяти.
капча C++
имеется сервис для рассылки смс как можно распознать капчу она там числовая 3х символьная http://sms.wapscriptphp.com/index.php
C++ Вводится строка каждое слово которой отделяется от других слов одним или несколькими пробелами. http://www.cyberforum.ru/cpp-beginners/thread597829.html
Вводится строка каждое слово которой отделяется от других слов одним или несколькими пробелами. Найти количество слов состоящих из пяти символов
C++ двумерный динамический массив Задан двумерный динамический массив, найти все элементы больше за среднее арифметическое в каждой строке и удалить их. Добавлено через 58 минут вот что я сделал.. только я сомневаюсь что это правильно(( помогите с кодом.. #include <iostream> #include <conio.h> using namespace std; подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.06.2012, 13:39     Перегрузка в c++
Перегрузка упрощает текст. Например, модуль числа может быть опеределён и для целых чисел, и для действительных и для разных разрядностей. И как быть? shabs, smabs, labs, fabs, dabs? Но семантически это одна функция, только для разных типов данных. И чтоб каждый раз не гадать, какая функция нужна для каких данных, лучше подойдёт одна abs. Но без перегрузки у неё только один вариант типов самой функции и параметра. Приводить тип к double, а потом назад? Это лишние операции, да и вещественные операции медленнее целых, а если приводить всё к целым, то у вещественных будет потеря точности. Вот для этого и нужна перегрузка. И ладно ещё числа друг к другу хоть приводятся. А если вектор (математический)? Вектор вообще не приводится к числу, а число к вектору. Или сортировка массивов с разными базовыми типами. Хотя, в принципе, именно эти задачи решаются шаблонами, так как под одним именем функции один алгоритм. Но шаблон - всего лишь автоматическая перегрузка по единому образцу с сохранением алгоритма. И по сути частный случай перегрузки. Но может быть и так, что алгоритм не совпадает. Например, сортировка дерева и односвязного списка с копанием в их внутренностях различается алгоритмически. Через итераторы не различается, а с копанием во внутренностях различается. А сама операция при этом семантически не меняется. Тогда придётся перегружать вручную. Или функция-друг det вычисления определителя матрицы для двух-трёх разных внутренних представлений данных матрицы. Перегрузка операторов решает ту же задачу упрощения исходного текста.
C++
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
class TVector
{
 public:
  float x,y,z;
};
...
TVector add(TVector a, TVector b)
{
 TVector r;
 r.x=a.x+b.x;
 r.y=a.y+b.y;
 r.z=a.z+b.z;
 return r;
};
...
TVector a,b,c, d;
/*надо вычислить d=a+b+c*/
/*Вариант 1*/
d=add(a,b);
a=add(d,c);
/*Косо до безобразия*/
/*Вариант 2*/
d=add(a,add(b,c));
/*Косо до безобразия*/
/*Вариант 3*/
d=add(add(a,b),c);
/*Косо до безобразия*/
. А если не 3 вектора, а больше?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TVector
{
 public:
  float x,y,z;
  TVector operator + (TVector b);
};
TVector TVector:: operator + (TVector b)
{
 TVector r;
 r.x=a.x+b.x;
 r.y=a.y+b.y;
 r.z=a.z+b.z;
 return r;
}
...
TVector a,b,c, d;
/*надо вычислить d=a+b+c*/
d=a+b+c; // Просто, понятно, читабельно, мала вероятность ошибок
.
 
Текущее время: 15:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru