Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перегрузка функций  (Прочитано 9976 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Olegator
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 03-01-2006 20:13 » 

Как я понял
Если я пишу так:
Код:
int func(int);
int func(double);
то всё нормально.
A если так:
Код:
int func(int);
double func(int);
, то нельзя.
Т.е. перегрузить функцию можно только при условии различных типов параметров и/или их количества.
А так, чтобы типы и количество параметров было одинаково, а тип возвращаемого значения различался то нельзя. Так?
Записан
Alf
Гость
« Ответ #1 : 03-01-2006 20:23 » 

А так, чтобы типы и количество параметров было одинаково, а тип возвращаемого значения различался то нельзя. Так?

Именно так. Страуструп на этот счет утверждает:

Цитата
Возвращаемые типы не участвуют в разрешении перегрузки.

(Страуструп, "Язык программирования С++, специальное издание", п.7.4.1. Перегрузка и возвращаемые типы).

Это позволяет избежать некоторых неоднозначностей в случае автоматического преобразования типов.
Записан
Olegator
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-01-2006 22:39 » 

Не пойму я смысла в перегрузке функций.
Как я понял, фактически это будут разные ф-ии с одинаковыми именами.
Пока я вижу 2 преимущества:
1.   Просто меньше печатать. Скопирую функцию. Изменю её, и всё.
2.   Удобнее для понимания уже написанного кода. Т.е. если я вижу несколько функций с одинаковым названием, то это означает что эти функции решают похожие задачи.
Записан
Alf
Гость
« Ответ #3 : 03-01-2006 23:00 » 

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

Например, ты можешь написать функцию сортировки, которая может сортировать массив целых чисел, строк Unicode и твоих собственных структур данных. Фактически, конечно, в каждом из этих случаев нужна отдельная функция (если только ты не решишь задачу в общем виде с использованием шаблонов), а компилятор сам выберет нужную, исходя из типа аргументов.

Кстати, весьма часто перегружаются конструкторы класса. Как бы ты смог обойтись без перегрузки в этом случае?
Записан
Olegator
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-01-2006 00:02 » 

Цитата из учебника "Как программировать на С++" Дейтел Х., Дейтел П.
Цитата
Перегруженные функции обычно используются для выполнения сходных операций над различными типами данных. Если операции идентичны для каждого типа, это можно выполнить более компактно и удобно, используя шаблоны функций — свойство, введенное в последней версии C++. Программист пишет единственное определение шаблона функции. Основываясь на типах аргументов, указанных в вызовах этой функции, C++ автоматически генерирует разные функции для соответствующей обработки каждого типа. Таким образом, определение единственного шаблона определяет целое семейство решений.
Здесь слова идентичны и схожи – это разные слова?
Т.е. как я понял схожи – означает присутствие небольших отличий, идентичны – означает полную схожесть.
Перегруженные функции применяются тогда, когда функции при работе с разными типами различаются, а шаблоны, когда не различаются.
« Последнее редактирование: 04-01-2006 01:02 от Olegator » Записан
Alf
Гость
« Ответ #5 : 04-01-2006 13:21 » new

Да, все именно так обстоит. Если действия над разными типами совершенно одинаковы, можно параметризовать эти типы шаблоном. Если в каждом конкретном случае действия чем-то отличаются, нужно воспользоваться перегруженной функцией, и компилятор сам выберет наиболее подходящий к фактическим параметрам вариант. Есть еще третий случай, как бы промежуточный между этими, когда действия отличаются для небольшого числа конкретных реализаций. В этом случае можно специализировать шаблон, и получится что-то среднее между обычным шаблоном и перегруженной функцией.

Однако не забывай про весьма важный случай перегрузки функций - перегруженные конструкторы. Без них класс не мог бы иметь набора различных конструкторов на все случаи жизни - конструктор по умолчанию, конструктор копирования и т.д. Если в большинстве остальных случаев перегрузка - лишь синтаксическое удобство, без которого в принципе можно обойтись, то без перегруженных конструкторов язык потерял бы намного больше гибкости.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines