Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы ООП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
203 Кб
Скачать
☆
  1. Манипуляции с состоянием объекта

Для доступа к внутренним информационным членам объекта, созданного на основе класса (чтение/запись), необходимо использовать специальные методы класса, называемые модификаторами (setters) и селекторами (getters). Они осу-ществляют подконтрольное считывание и изменение внутренних информаци-онных членов. Так, если изменяется внутреннее информационное поле size объекта класса stack, описывающее максимальный размер стека, то необходимо осуществить ряд действий по согласованному изменению других информаци-онных членов (выделение дополнительной памяти и т. д.):

class stack { int* c1;

int top, size; public:

. . .

int putnewsize(int ns){ if (top > ns) return 1; int* nc1 = new int[ns]; if (top > 0)

for (int i = 0; i < top; i++) nc1[i] = c1[i];

delete c1; c1 = nc1; size = ns; return 0;

}

};

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

  1. Класс как область видимости

Класс является областью видимости описанных в нем членов класса. Иден-тификатор члена класса локален по отношению к данному классу. Классы могут быть вложенными. Одноименные идентификаторы членов класса закрывают видимость соответствующих внешних идентификаторов.

Операция '::' позволяет получить доступ к одноименным объектам, внешним по отношению к текущей области видимости, в частности, к глобальным функциям и переменным, следующим образом:

имя_класса :: имя_члена_класса или

:: имя - для имен глобальных функций и переменных.

Пример:

int ia1;

void f1(int b1) { ia1 = ia1 + b1;

}

class x {

int ia1; public:

x(){ia1 = 0;} void f1(int b1){

::f1(b1); // вызов глобальной функции

}

};

int main(){ x a2; a2.f1(2); return 0;

}

  1. Объявление и определение методов класса. Спецификатор inline

Каждый метод класса, должен быть определен в программе. Определить метод класса можно либо непосредственно в классе (если тело метода не слишком сложно и громоздко), либо вынести определение вне класса, а в классе только объявить соответствующий метод, указав его прототип.

При определении метода класса вне класса для указания области видимости соответствующего имени метода используется операции ‘::’:

Пример:

class x {

int ia1; public:

x(){ia1 = 0;} int func1();

};

int x::func1(){ … return ia1; }

Это позволяет повысить наглядность текста, особенно , в случае значитель-ного объема кода в методах. При определении метода вне класса с использова-нием операции ‘::’ прототипы объявления и определения функции должны совпадать.

Метод класса и любую функцию, не связанную ни с каким классом, можно определить со спецификатором inline:

inline int func1();

Такие функции называются встроенными.

Спецификатор inline указывает компилятору, что необходимо по воз-можности генерировать в точке вызова код функции, а не команды вызова функции, находящейся в отдельном месте кода модуля. Это позволяет уменьшить время выполнения программы за счет отсутствия команд вызова функции и воз-врата из функции, которые кроме передачи управления выполняют действия со-ответственно по сохранению и восстановлению контекста (содержимого ос-новных регистров процессора). При этом размер модуля оказывается увеличен-ным по сравнению с программой без спецификаторов inline. Следует отметить, что спецификатор inline является рекомендацией компилятору. Данный спе-цификатор неприменим для функций со сложной логикой. В случае невозмож-ности использования спецификатора для конкретной функции компилятор выдает предупреждающее сообщение и обрабатывает функции стандартным способом.

По определению методы класса, определенные непосредственно в классе, являются inline-функциям