Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать
  1. Доступ к глобальным переменным, скрытым локальными переменными с тем же именем (оператор ::).

В С++ предусмотрен доступ к глобальным переменным, скрытым локальными переменными с тем же именем. Операция разрешения области видимости :: позволяет в таких ситуациях воспользоваться глобальной переменной.

Например: int x=5; void main() { int x=3; printf("Локальная x= %d\n",x); printf("Глобальная x= %d\n",:x); }

В описаниях кроме имен переменных и имен типов используются модификаторы : * - указатель, () - функция и [] - массив, причем в описаниях сложных объектов модификаторов может быть много,что затрудняет чтение и запись таких конструкций. Для правильной интерпретации описаний используются следующие правила приоритетов. 1) чем ближе модификатор к имени, тем выше его приоритет; 2) [] и () имеют более высокий приоритет, чем *; 3) можно использовать круглые скобки для повышения приоритета модификатора. *. Модификаторы доступа volatile и const позволяют сообщить компилятору об изменчивости или постоянстве определяемого объекта. Если переменная описана как const, то она недоступна в других модулях проекта, подобно статическим переменным, и не может быть изменена в процессе выполнения программы. Константа должна быть инициализирована при описании. С помощью модификатора const создаются типизированные именованные константы, которые в отличие от символических констант, определенных директивой #define, подлежат контролю типов.

Например: const double PI=3.141528; const char yes='Y'; Одно из важных применений переменных типа const - защита параметров функции от модификации, если аргумент передается по ссылке. Модификатор volatile сообщает компилятору, что значение таких подвижных объектов может быть изменено скрытно от компилятора каким-либо фоновым процессом. Например, при обработке прерывания глобальная переменная, содержащая системное время компьютера, может изменить свое значение. Компилятор не должен помещать такие переменные в регистровую память. Пример объявления : volatile unsigned timer;

  1. Доступ к членам базовых классов внутри производного класса.

Объект производного класса фактически построен из нескольких частей. Каждый базовый класс вносит свою долю в виде подобъекта, составленного из нестатических данных-членов этого класса. Объект производного класса построен из подобъектов, соответствующих каждому из его базовых, а также из части, включающей нестатические члены самого производного класса. Так, наш объект NameQuery состоит из подобъекта Query, содержащего члены _loc и _solution, и части, принадлежащей NameQuery, - она содержит только член _name.

Внутри производного класса к членам, унаследованным из базового, можно обращаться напрямую, как к его собственным. (Глубина цепочки наследования не увеличивает затраты времени и не лимитирует доступ к ним.) Например:

void

NameQuery::

display_partial_solution( ostream &os )

{

os < < _name

< < " is found in "

< < (_solution ? _solution->size() : 0)

< < " lines of text\n";

}

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

NameQuery nq( "Frost" );

// вызывается NameQuery::eval()

nq.eval();

// вызывается Query::display()

nq.display();

либо непосредственно из тела другой (или той же самой) функции-члена:

void

NameQuery::

match_count()

{

if ( ! _solution )

// вызывается Query::_vec2set()

_solution = _vec2set( &_loc );

return _solution->size();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]