А.В. Столяров - Введение в язык Си++ (1114949), страница 15
Текст из файла (страница 15)
45.68Повторим, что введённое таким образом статическое поле будет существовать в программе в единственном экзем пляре и в течениевсего времени выполнения п рограм м ы вне всякой зависимости оттого, будут ли в вашей программе заводиться объекты класса А й в какихколичествах. Если поместить объявление статического поля в приватнойчасти класса, то соответствующее имя будет доступно только в методахкласса и в «дружественных» функциях. Объявление можно поместить ив открытую часть класса. В этом случае оно будет доступно отовсюду, аобратиться к нему можно будет как через существующий объект, так ибез всякого объекта с помощью явного раскрытия области видимости:А а;a .th e _ s ta tic _ f ie ld = 15; / / правильноA ::th e _ s ta tic _ fie ld = 15; / / тоже правильноСледует отметить, что статические поля схожи с глобальными переменными втом числе и тем, что в них программа может н а к а п л и в а т ь г л о б а л ь н о е сост ояние,в результате чего для стороннего наблюдателя поведение одних и тех же функций окажется изменяющимся по неочевидным законам.
Кроме того, статическиеполя могут существенно затруднить масштабирование программы. Так, если вамзачем-то понадобился список объектов определённого класса и вы ввели для этойцели статический указатель на первый элемент такого списка, то это означает, чтов программе такой список может быть только один, а если когда-нибудь понадобится два таких списка (из объектов одного и того же типа), программу придётсяочень серьёзно переделать.Поэтому использование статических полей рекомендуется в одной и только одной ситуации: когда такое поле представляет собой константу, то есть его значение никогда не изменяется во время работы программы. Например, статическимможно объявить какой-нибудь крупный массив, содержащий н е и з м е н н ы е данные,необходимые для работы объектов данного класса, но не требующиеся нигде заего пределами. Примером такого массива могут служить, например, таблица переходов между состояниями конечного автомата в классе, реализующем этот конечный автомат; массив строк с возможными диагностическими сообщениями;таблица соответствия пользовательских команд (строк) вызываемым функциям,и т.п.§ 2.21.2.
Статические методыС т а т и ч е с к и й м е т о д — это особый вид функции-метода, которая,являясь методом класса и имея доступ к его закрытым деталям реализации, при этом вы зы вается независимо от объектов к ласса. Первоначально статические методы предназначались для работы со статическими полями, но получившийся механизм нашел в итоге существенноболее широкий спектр применений. Описание статического метода аналогично описанию обычного метода, но перед таким описанием ставитсяключевое слово s t a t ic , как в следующем примере:69c la s s C ls {//...s t a t i c in t TheStaticM ethod(int a, in t b ) ;//...Обращение к статическому методу, как и к статическому полю, возможнокак через объект класса, так и без такового, с помощью символа раскрытия области видимости:C ls : :TheStaticM ethod(5, 15); / / всё правильноCls с ;с .TheStaticM ethod(5, 15); / / так тоже можноПоскольку статическая функция-метод может быть вызвана без объекта, у неё, как следствие, отсутствует неявный параметр th is (см.§ 2.1.2).
Кроме всего прочего, это означает, что такая функция не можетпросто так обращаться, как другие методы, к полям объекта, ведь объекта у неё нет. Вызывать нестатические функции-методы статическаяфункция тоже просто так не может, поскольку нестатические методыдолжны вызываться для конкретного объекта. Ситуация кардинальноменяется, если статическая функция тем или иным способом всё-таки получает доступ к объекту своего класса. Такое вполне может произойти иникоим образом не противоречит определению статического метода: действительно, никто не мешает передать объект через один из явно обозначенных параметров; вполне возможно получить доступ к объекту своегокласса через глобальные переменные или с помощью глобальных функций; наконец, стати ческая ф ун кц и я вполне м ож ет со зд ать объектсама.Итак, несмотря на отсутствие указаний на конкретный объект привызове статической функции, она в некоторых случаях может получитьдоступ к объекту своего класса.
И тогда стати ческая ф ун кци я, каки любой метод к л асса, м ож ет о бращ аться к зак р ы ты м (при ватным) полям и м етодам объекта (действительно, как уже говорилосьранее, единицей защиты в С и + + является не объект, а класс или структура целиком).Наличие в С и + + статических методов позволяет в ряде случаевприменять весьма изящные приёмы программирования. Например, мывполне можем убрать в закрытую часть класса все имеющиеся конструкторы, запретив, таким образом, создание объектов данного класса извнеего самого, и поручить создание объектов статическому методу, которыйможно вызвать, не имея ни одного объекта.703.
Обработкаисключительных ситуаций§3.1. О ш ибочны е ситуации и проблем ы ихобработкиЛюбая сколь бы то ни было нетривиальная программа содержитфрагменты, которые в некоторых обстоятельствах не могут отработатькорректно. Например, программа, анализирующая содержимое заданного файла, не сможет работать, не сумев открыть файл на чтение; программа, работающая по компьютерной сети, не сможет работать, если неработает сеть или если недоступен нужный сервер; функция, производящая сложные вычисления, не может корректно их завершить, если входе вычислений потребовалось деление на ноль или, например, вычисление логарифма по единичному основанию, и т. п. Подобные ситуацииназывают ошибочными, однако же это совершенно не обязательно означает, что ошибся программист, писавший программу.
В случае с файлом«виноват» в возникновении ошибочной ситуации, скорее всего, пользователь, в случае с сетью — обслуживающий персонал сети или сервера;пример с делением на ноль указывает на ошибку программиста, вызвавшего функцию для некорректных исходных параметров, но это можетбыть не тот программист, который написал саму функцию.Иначе говоря, мы при написании программ часто сталкиваемся сослучаями, когда успешная работа нашей программы зависит от внешнихусловий, которые мы сами гарантированно обеспечить не можем.
В такихслучаях приходится предусматривать в программе о бр аботк у ош ибок.Проверить все нужные условия обычно несложно. Существенно сложнее может оказаться следующий вопрос: а что же делать, если условияоказались неудовлетворительны,— не открылся файл, не установилосьсоединение, в делителе оказался ноль,— то есть возникла та самая ошибочная ситуация? Многие студенты в такой ситуации поступают просто,71дёшево и сердито: печатают какое-нибудь сообщение (очень часто просто "ERROR") и завершают выполнение программы, например, вызовомe x it ().
В реальной жизни такой вариант, как правило, недопустим. Чтобы понять причины этой недопустимости, представьте себе, что вы долгонабирали текст в каком-нибудь текстовом редакторе, потом при сохранении случайно ввели неправильное имя директории или, например, попытались осуществить запись на защищённый носитель. Если бы автортекстового редактора обрабатывал ошибки «по-студенчески», программаредактора бы немедленно завершилась, уничтожив все результаты вашейработы.
Маловероятно, что такое могло бы вам понравиться.Более того, не всегда и не везде можно так вот просто «напечатать сообщение». Например, при программировании оконного приложения подMS Windows никакого потока стандартного вывода в распоряжении программиста нет, так что вместо печати необходимо создавать модальныйдиалог с соответствующим текстом и кнопками. Под ОС Unix всё не такплохо, поток стандартного вывода есть всегда, есть даже специальныйпоток для вывода сообщений об ошибках; проблема только в том, чтодалеко не во всех случаях результаты вывода в эти потоки кто-то читает, и в некоторых случаях следует вместо них пользоваться системойжурнализации.Кроме того, не все ошибочные ситуации фатальны.