Перегрузка функций-членов в языке Си. Инициализация объектов. Перегрузка операторов в C++. Операторы преобразований
Дополнительные возможности использования функцийДополнительные возможности позволяют:
Мы уже говорили о перегрузке функций на занятии посвящённом функциям. Функции-члены можно перегрузить точно так же. #include<iostream.h>
Таким же образом можно перегружать конструкторы. В конструкторе можно инициализировать члены не в теле, а в момент инициализации самого конструктора, синтаксис выглядит следующим образом: Rect::Rect(int wedth,int height): Особенностью функции, которая имеет параметр по умолчанию является возможность ситуации: если параметр не указывается в скобках при вызове, то он имеет это значение. Значения параметров по умолчанию могут задаваться справа налево, пример: void DrawRect (int aWidth, bool Use = false, int aHeight);не может быть использован, так как самый правый параметр по умолчанию не имеет значения. Выбор между перегруженными функциями и значениями по умолчанию с одной стороны является делом каждого программиста, но существуют общие принципы, когда перегрузка функции предпочтительнее:
Как уже говорилось, существует конструктор по умолчанию, который никак себя не проявляет, пользователь имеет возможность написать свой собственный конструктор по умолчанию ( по определению это конструктор не имеющий параметров). Это необходимо если в программе был создан свой конструктор, с этого момента компилятор перестаёт предлагать конструктор по умолчанию, даже в ситуации, когда необходим конструктор без параметров. Конструктор может быть перегружен, как и любая другая функция, это необходимо для повышения гибкости программы. Например: можно в предыдущем примере создать конструктор, который при введении его без параметров будет использовать значения по умолчанию.
Функции — друзьяДружественная функция — это функция, которая не является методом класса, но имеет доступ к собственным и защищённым элементам класса. Функция не может быть другом без согласия класса, то есть она должна быть описана в теле класса с помощью специального слова friend. Дружественная функция при вызове не получает указателя *this Объекты классов должны передаваться явно через аппарат параметров. При её вызове нельзя использовать аппарат вызова метода класса. Использование дружественных функций позволяет упростить интерфейс между классами. Можно сделать все функции класса Y друзьями класса X: Class Y int I;
Перегрузка операторовФорма для перегрузки операторов: Объявление перегруженных операторов осуществляется так же, как и функций. Используется специальное слово: operator , за которым следует сам перегружаемый оператор. В функциях с одним операндом параметры не задаются Const класс & класс::operator …(); Перегрузка оператора с двумя операндами требует наличия параметров (константные ссылки на объекты этих классов): Рекомендации:
#include<iostream.h>
V_3d:: V_3d(const V_3d &v1)
void main(void)
Результат работы программы: координаты вектора b:
Конструктор-копировщикВ предложенной программе используются дополнительные возможности функций-членов — перегрузка, использование значений по умолчанию, использование нескольких конструкторов, в том числе и по умолчанию, перегрузка операторов = и+и конструктор –копировщик Копировщик, предоставляемый компилятором, осуществляет схему поверхностного копирования может привести к ошибкам в случае, если среди данных-членов класса имеется указатели.
Первая схема для глубинного копирования позволяет полностью скопировать все данные, а не только указатели. |