
6.Использование this
Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект.
Допустим имеется некий метод в неком классе. При вызове этого метода ему передается автоматически неявно заданный аргумент, который представляет собой ссылку на вызывающий объект. Эта ссылка и называется ключевым словом this. В большинстве случаев программисты им не пользуются. Но из this можно иногда извлечь пользу. Например, синтаксис С# допускает, чтобы имя параметра или локальной переменной совпадало с именем переменной экземпляра. В этом случае локальное имя будет скрывать переменную экземпляра. И тогда доступ к скрытой переменной экземпляра можно получить с помощью ссылки this. Например, следующий фрагмент кода (хотя его стиль написания не рекомендуется к применению) представляет собой синтаксически допустимый способ определения конструктора в классе: public Rect(int width, int height) { this.width = width; this.height = height; } В этой версии конструктора имена параметров совпадают с именами переменных экземпляра, в результате чего за первыми скрываются вторые, а ключевое слово this как раз и используется для доступа к скрытым переменным экземпляра.
7.Перегрузка операций.
С++ позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции. Эта дает возможность использовать собственные типы данных точно так же, как стандартные. Обозначения собственных операций вводить нельзя. Можно перегружать любые операции, существующие в С++, за исключением:
. |
.* |
?: |
:: |
# |
## |
sizeof |
Перегрузка операций осуществляется с помощью методов специального вида (функций-операций) и подчиняется следующим правилам:
при перегрузке операций сохраняются количество аргументов, приоритеты операций и правила ассоциации (справа налево или слева направо), используемые в стандартных типах данных;
для стандартных типов данных переопределять операции нельзя;
функции-операции не могут иметь аргументов по умолчанию;
функции-операции наследуются (за исключением =);
функции-операции не могут определяться как static.
Функцию-операцию можно определить тремя способами: она должна быть либо методом класса, либо дружественной функцией класса, либо обычной функцией. В двух последних случаях функция должна принимать хотя бы один аргумент, имеющий тип класса, указателя или ссылки на класс. Функция-операция содержит ключевое слово operator, за которым следует знак переопределяемой операции:
тип operator операция ( список параметров) { тело функции }