Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры печатать.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
379.36 Кб
Скачать

8. Перегрузка функций (методов класса). Почему следует использовать перегрузку. Перегрузка функций. Перегрузка конструкторов.

Методы классов, так же как и обычные функции C++, можно перегружать. Перегрузка функций означает, что в текущей области действия одно и то же имя могут использовать несколько функций. Компилятор выбирает нужную функцию, учитывая количество и тип аргументов, использованных при ее вызове.

Пример: class absolute_value

{public:

int number(int); double number(double);};

int absolute_value::number(int test_data)

{ int answer; answer=abs(test_data); return(answer);}

double absolute_value::number(double test_data)

{ double answer; answer=fabs(test_data); return(answer);}

Программа выбирает соответствующий метод класса, учитывая тип (int или doable) аргумента, передаваемого вместе с именем метода.

Перегрузка методов класса обеспечивают программе и программисту гибкость при работе с различными форматами данных.

Перегрузка функций улучшает удобочитаемость программ

Перегрузка функций C++ позволяет вашим программам определять несколько функций с одним и тем же именем. Перегруженные функции должны возвращать значения одинакового типа*, но могут отличаться количеством и типом параметров. До появления перегрузки функций в C++ программисты языка С должны были создавать несколько функций с почти одинаковыми именами. К сожалению программисты, желающие использовать такие функции, должны были помнить, какая комбинация параметров соответствует какой функции. С другой стороны, перегрузка функций упрощает задачу программистов, требуя, чтобы они помнили только одно имя функции.

Для перегрузки конструктора достаточно объявить его во всех нужных форматах и определить нужное действие для каждого из конструкторов. Но стоит отметить, что перегрузка конструктора или любого другого метода дополнительно нагрузит вашу программу. Перегрузка конструкторов:

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

Class X

{

int integer_part;

double double_part;

public:

X(int i){integer_part =i;}

X(double d){double_part=d;}

}

9. Перегрузка функций (методов класса). Создание и использование конструкторов копирования. Устаревшее ключевое слово overload. Перегрузка и неоднозначность. Ключевое СЛОВО explicit. Определение адреса перегруженной функции.

Методы классов, так же как и обычные функции C++, можно перегружать. Перегрузка функций означает, что в текущей области действия одно и то же имя могут использовать несколько функций. Компилятор выбирает нужную функцию, учитывая количество и тип аргументов, использованных при ее вызове.

Пример: class absolute_value

{public:

int number(int); double number(double);};

int absolute_value::number(int test_data)

{ int answer; answer=abs(test_data); return(answer);}

double absolute_value::number(double test_data)

{ double answer; answer=fabs(test_data); return(answer);}

Программа выбирает соответствующий метод класса, учитывая тип (int или doable) аргумента, передаваемого вместе с именем метода.

Перегрузка методов класса обеспечивают программе и программисту гибкость при работе с различными форматами данных.

Перегрузка функций улучшает удобочитаемость программ

Перегрузка функций C++ позволяет вашим программам определять несколько функций с одним и тем же именем. Перегруженные функции должны возвращать значения одинакового типа*, но могут отличаться количеством и типом параметров. До появления перегрузки функций в C++ программисты языка С должны были создавать несколько функций с почти одинаковыми именами. К сожалению программисты, желающие использовать такие функции, должны были помнить, какая комбинация параметров соответствует какой функции. С другой стороны, перегрузка функций упрощает задачу программистов, требуя, чтобы они помнили только одно имя функции.

конструктор копирования

конструктор копирования входит в обязательный набор конструкторов для любого класса. Реализация механизма копирования значений для транслятора не является неразрешимой задачей. Конструктор копирования всего лишь создаёт копии объектов. Этот процесс реализуется при помощи стандартного программного кода.

Синтаксис конструктора копирования

имя_класса(const имя_класса & W){

тело конструктора}

конструктор копирования получает в качестве параметра указатель на объект того же типа и присваивает своим полям те же значения, что и полученного объекта. То есть состояние объекта как бы копируется.

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

основная форма ключевого слова overload: overload имя функции;

Здесь имя ф-ции – имя перегружаемой ф-ции. Перед этой инструкцией должно находиться объявление перегружаемой ф-ции.

Ключевое слово overload является устаревшим и в современных компиляторах C++ не поддерживается.

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

В С++ есть ключевое слово explicit, позволяющее запретить неявное преобразование аргумента конструктора. Применяется только к конструкторам.Пример:

class MyClass

{ int i;

public:

explicit MyClass(int r)

{ i = r; }

};

int main()

{

MyClass A(9); // правильно

MyClass B = 9; // ошибка компиляции, неявное преобразование запрещено explicit-конструктором

return 0;

}

Вообще, если конструктор имеет 1 параметр, рекомендуется использовать explicit, т.к. неявное преобразование типов потенциально опасно.