Программирование на Objective-C 2.0
Шрифт:
Преобразование более длинного значения с плавающей точкой в более ко-роткий тип может вызывать или не вызывать округление, прежде произой-дет усечение. Классы памяти и область действия
Термин класс памяти (storage class) относится к способу выделения памяти ком-пилятором и к области действия определения конкретной функции или метода. Классы памяти — это auto, static, extern и register. Класс памяти можно не указывать в объявлении, и он будет назначен по умолчанию, как это описывается ниже.
Термин область действия (scope) относится к границам действия определенного идентификатора внутри программы. Идентификатор, определенный вне любой функции, метода или блока операторов (мы будем называть здесь это БЛОКОМ), доступен для ссылки в любой последующей точке файла. Идентификаторы,
Если при определении функции определяется класс памяти, он должен быть указан как static или extern. К функции, которая объявляется как static, можно обращаться только в пределах файла, который содержит эту функцию. Функ-ции, объявленные как extern (или функции, для которых не указан никакой класс), могут вызываться функциями или методами из других файлов. Переменные
В таблице В.5 приводится сводка различных классов памяти, которые могут использоваться в объявлении переменных, а также их области действия и спо-собы их инициализации.
Табл. В.5. Переменные: сводка классов памяти, областей действия и способов инициализации Класс памяти Место объявления переменной На нее можно ссылаться И инициализировать с помощью Комментарии static Вне любого БЛОКА Внутри данного файла Только константного выражения Переменные инициализируются только один раз при запуске программы; значения сохраняются в пределах БЛОКОВ; значение по умолчанию 0 Внутри какого-либо БЛОКА Внутри этого блока extern Вне любого блока Внутри данного файла Только константных выражения Переменная должна быть определена хотя бы в одном месте без ключевого слова extern или в одном месте с использованием ключевого слова extern с присваиванием начального значения. Внутри какого-либо БЛОКА Внутри этого блока auto Внутри какого-либо БЛОКА Внутри этого блока Любого допустимого выражения Переменная инициализируется каждый раз при входе в БЛОК; нет никакого значения по умолчанию. register Внутри какого-либо БЛОКА Внутри этого блока Любого допустимого выражения Присваивание регистра (register) не гарантируется; разнообразные ограничения на типы переменных, которые могут быть объявлены; нельзя брать адрес переменной с register; инициализируется каждый раз при входе в этот БЛОК; нет никакого значения по умолчанию. Не указан Вне любого блока Внутри данного файла или из других файлов, которые содержат соответствующие объявления Только константного выражения Это объявление может появляться только в одном месте; переменная инициализируется при запуске программы; значение по умолчанию 0; по умолчанию используется класс памяти auto. Внутри какого-либо БЛОКА (См. auto) (См. auto) Переменные экземпляра
К переменным экземпляра можно получать доступ с помощью любого метода экземпляра, определенного для данного класса в секции interface, где явно объявляется эта переменная, или в категориях, созданных для данного класса. К наследуемым переменным экземпляра тоже можно осуществлять непосред-ственный доступ без каких-либо специальных объявлений. Методы класса не имеют доступа к переменным экземпляра.
Для управления областью действия переменной экземпляра можно исполь-зовать специальные директивы @private, @protected и @риЫк. После появления этих директив они действуют, пока не встретится закрывающая фигурная скобка, заканчивающая объявление соответствующих переменных экземпляра, или пока не будет
Переменная internallD объявлена как private, переменные x и у — как protected (директива по умолчанию), переменная valid — как public.
Эти директивы описываются в таблице В.6.
Табл. В.6. Область действия переменных экземпляра Директива На переменную можно ссылаться Комментарии @protected С помощью методов экземпляра в данном классе, методов экземпляра в подклассах, и методов экземпляра в расширениях категорий на данный класс. Эта директива по умолчанию. @private С помощью методов экземпляра в данном классе, методов экземпляра в расширениях категорий на данный класс, но не из каких-либо подклассов. Эта директива ограничивает доступ самим классом. @public С помощью методов экземпляра в данном классе, методов экземпляра в подклассах и методов экземпляра в расширениях категорий на данный класс; доступ к такой переменной можно также выполнять из других функций или методов, применяя к экземпляру класса оператор косвенного указателя структуры (->), после которого следует имя переменной экземпляра (например, myfract->numerator). Эту директиву следует использовать только при необходимости; она нарушает понятие инкапсуляции данных. Функции
В этом разделе содержатся сведения о синтаксисе и работе функций. Определение функции Общий формат возвращаемыйТип имя (тип1 парам 1, тип2 парам2,..) { Объявления Переменных программныйОператор программныйОператор return выражение; }
Определяется функция имя, которая возвращает значение типа возвращаемый-Тип и имеет формальные параметры парам1, парам2,парам 1 объявляется с типом тип/, парам2с типом тип2, ит.д.
Локальные переменные обычно объяапяются в начале функции, но это не обязательно. Они могут быть объявлены в любом месте, и тогда доступ к ним ограничен операторами, которые следует в функции после их объявления.
Если функция не возвращает значения, то возвращаемыйТип указывается как void.
Если в круглых скобках содержится только void, функция не принимает ни-каких аргументов. Если применяются .. в качестве последнего (или единственного) параметра в списке, функция принимает переменное число аргументов, например, int printf (char *format, ...) { }
В объявлениях для аргументов одномерных массивов не обязательно указывать число элементов этого массива. Для многомерных массивов нужно обязательно указать размер каждой размерности, кроме первой.
Описание оператора return см. ниже в разделе «Оператор return». По-прежнему поддерживается старый способ определения функций. Для этого используется следующий общий формат. возвращаемыйТип имя (парам 1, парам2,„) объявления параметров { ОбъявленияПеременных программныйОператор программныйОператор return выражение, }
Здесь в круглых скобках указываются только имена параметров. Если функция не принимает никаких аргументов, то указываются только левая и правая круглые скобки. Тин каждого параметра объявляется вне круглых скобок и перед левой фигурной скобкой, открывающей определение функции. Например, ниже определяется функция с именем rotate, которая принимает два парамегра с именами value и п. unsigned int rotate (value, n) unsigned int value; int n; { }
Первый аргумент определяется как unsigned int и второй как int.
Перед определением функции можно поместить ключевое слово inline как указание компилятору. Некоторые компиляторы заменяют вызов такой функ-ции конкретным кодом самой функции, что ускоряет выполнение. Ниже пока-зан соответствующий пример. inline int min (int a, int b) { return ( a < b ? a : b); } Вызов функции Общий формат имя ( арг1, арг2,..)
Происходит вызов функции имя, и значения арг1, арг2, ... передаются функ-ции как аргументы. Если функция не принимает никаких аргументов, указы-ваются только открывающая и закрывающая круглые скобки (например, initialize 0).