- •45. Вызовы конструкторов в процессе работы программы.
- •48. Деструкторы.
- •49. Поля данных. Нестатические и статические поля – особенности их создания и инициализации. Правила обращения к полям. Константные поля.
- •50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
- •51. Указатель this.
- •52. Дружественные функции и классы.
- •53. Перегрузка операций – общие положения.
- •54. Перегрузка операции присваивания. Особенности работы с ресурсоемкими объектами.
- •55. Перегрузка унарных операций.
- •56. Перегрузка бинарных операций.
- •57. Особенности определения классов с ключами struct и union.
- •58. Включение классов.
- •59. Наследование классов – общие положения.
- •Класс а
- •61. Общие особенности механизма простого наследования классов.
- •62. Множественное наследование.
- •63. Перечень специальных методов класса. Особенности определения конструкторов и деструкторов в производных классах.
- •64. Особенности определения и применения функций-операций «присваивание» в производных классах.
- •65. Особенности перегрузки операций в производных классах.
- •66. Общая характеристика виртуальных функций.
50. Методы. Основные правила работы с методами. Константные методы. Статические методы.
Основные правила работы с методами в С++:
метод – функция определена внутри класса
в определении класса метод может быть либо определен полностью (встроенной функцией), либо объявлен как прототип и тогда вне класса необходимо давать его полное внешнее описание
Пример:
Point.Krit_point ( ); // (1) вызов метода непосредственно от имени объекта с использованием операции •
Ptr Point → Krit_point ( ); // (2) “→” выбор элемента пол указателю
Если метод (… А) определяется с private или protected, то к нему можно обратиться внутри другого открытого метода (… В), при этом к методу А следует обращаться только по его имени.
Указатель на объект будет присоединен к имени методу, и это будет указывать на тот объект от которого обратились к методу (… В). Помимо обычных методов можно определить конструктор и статические методы.
Константные методы:
объявляются с const после списка параметров
они могут обращаться к любым полям, но не могут менять значения полей, поэтому такие методы рекомендуется создавать для работы с константными объектами
они могут вызывать только константные методы
они могут вызываться от любых не только константных объектов
Статические методы:
к ним можно обращаться не только от имени объекта, но и от имени класса, в том числе до создания хотя бы одного объекта этого класса, при этом используются квалифицированные имена, то есть операции доступа видимости класса
static void Print_Couter ( ); // (3)
Назначение которое выводит в консольное окно значение счетчика FCounter, FLivePoint, тогда полное определение вне класса должно быть таким:
Void TTochka_v_pole:: PointCounter ( ) // (4)
{cout << “поле FLIvePrint = “ << FCouter << endl; // (5)
сout << “поле FLivePoint = “ << FLivePoint << endl;} // (6)
TTochka_v_pole:: PointCounter ( ); // (7) обращаемся от имени класса
Point.PrintCounter ( ); // (8) обращаемся от имени объекта
Другие особенности статических методов:
в их теле непосредственно можно обратиться к статическим полям и методам
они не могут быть константными или виртуальными (virtual)
51. Указатель this.
Рассмотрим вопрос о механизме обращения к полю А или методу В внутри другого не статического метода С. В этом случае нужно применять только неквалифицированные имена А или В, к которым будут присоединены указатели на тот объект от имени которого обратились к С. Для примера приведем 2 фрагмента.
Point4.Vivod_v_consol ( ); // (1) от имени объекта Point4 обращаемся к открытому нестатическому полю vivod_v_consol
cout << Fmax Z; // (2) здесь к полю Fmax Z обращается не указатель имени объекта
Вопрос:
«Как компилятор «догадывается», что в операторе 2 имеется ввиду поле Fmax Z именно Point4?»
Причина в том, что согласно С++, каждый нестатический метод передает скрытые параметры this(служебное слово), в нем хранятся константные указатели именно на тот объект от которого был вызван не статический метод Point4. Именно этот указатель неявно используется внутри метода. Благодаря этому при компиляции вывод из строки 2 превращается в:
cout << this → Fmax Z // (3)
Строка 3 могла бы появиться явно вместо строки 2.
В статических методах указатель this не передается. (Это понятно простому сибирскому ежику :D)
Помимо рассмотренного конструктора С++ допускает использование указатели на поля данных и на методы класса • и →.