logo search
шпоры по ООП

30.Объекты класса и указатели на объекты класса.

#include <iostream.h>

class A

{

};

class AB: public A

{

};

class AC: public A

{

};

void main ()

{

A *pObj;

A MyA;

pObj = &MyA;

cout << "OK A" << endl;

AB MyAB;

AC MyAC;

pObj = &MyAB;

cout << "OK AB" << endl;

pObj = &MyAC;

cout << "OK AC" << endl;

}

Это очень простой пример. Пустые классы, простое наследование… Единственно, что важно в объявлении этих классов - спецификаторы доступа в описании баз производных классов. Базовый класс (его будущие члены) должен быть абсолютно доступен в производном классе. Первый оператор функции main() - объявление указателя на объект класса A. Затем следует определение объекта-представителя класса A, следом - настройка указателя на этот объект. Естественно, при этом используется операция взятия адреса. Всё это давно известно и очень просто. Следующие две строки являются определениями пары объектов, которые являются представителями двух разных производных классов…

За объявлениями объектов в программе располагаются строки, которые позволяют настроить указатель на базовый класс на объект производного класса. Для настройки указателя на объект производного класса нам не потребовалось никаких дополнительных преобразований. Здесь важно только одно обстоятельство. Между классами должно существовать отношение наследования. Таким образом, проявляется важное свойство объектно-ориентированного программирования: УКАЗАТЕЛЬ НА БАЗОВЫЙ КЛАСС МОЖЕТ ССЫЛАТЬСЯ НА ОБЪЕКТЫ - ПРОИЗВОДНЫХ КЛАССОВ.

указатель this

объект содержит свой экземпляр полей класса. Методы класса находят-з памяти в единственном экземпляре и используются всеми объектами совме-г.: этому необходимо обеспечить работу методов с полями именно того объ-] я которого они были вызваны. Это обеспечивается передачей в функцию гого параметра this, в котором хранится константный указатель на вызвав-функцию объект. Указатель thi s неявно используется внутри метода для ■ж на элементы объекта. В явном виде этот указатель применяется в основ-ч возвращения из метода указателя (return this;) или ссылки (return - вызвавший объект.

пюстрации использования указателя this добавим в приведенный выше tr новый метод, возвращающий ссылку на наиболее здорового (поле двух монстров, один из которых вызывает метод, а другой передается

1 качестве параметра (метод нужно поместить в секцию public описания

S the_best(monstr &М){ ' -ealth > M.getJiealthO) return *this; return M:

... monstr Vasia(50), Super(200);

// Новый объект Best инициализируется значениями полей Super: monstr Best = Vasia.the_best(Super);

Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости:

void cure(int health, int ammo){

this -> health += health: // Использование this monstr:: ammo += ammo; // Использование операции ::

}