Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Топ:
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Интересное:
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Дисциплины:
2017-06-09 | 261 |
5.00
из
|
Заказать работу |
|
|
Директива #pragma используется для выдачи дополнительных указаний компилятору. Например, не выдавать предупреждений при компиляции, или вставить дополнительную информацию для отладчика. Конкретные возможности директивы #pragma у разных компиляторов различные.
Директива #error выдает сообщение и завершает компиляцию. Например, конструкция
#ifndef unix#error "Программу можно компилировать только для Unix!"#endifвыдаст сообщение и не даст откомпилировать исходный файл, если макроимя unix не определено.
Директива #line изменяет номер строки и имя файла, которые хранятся в предопределенных макроименах __LINE__ и __FILE__.
Кроме директив, у препроцессора есть одна операция ##, которая соединяет строки, например A ## B.
Лекция 16 Определение, время жизни и области видимости переменных в больших программах
Файлы и переменные
Автоматические переменные определены внутри какой-либо функции или метода класса. Назначение автоматических переменных – хранение каких-либо данных во время выполнения функции или метода. По завершении выполнения этой функции автоматические переменные уничтожаются и данные теряются. С этой точки зрения автоматические переменные представляют собой временные переменные.
Иногда временное хранилище данных требуется на более короткое время, чем выполнение всей функции. Во- первых, поскольку в Си++ необязательно, чтобы все используемые переменные были определены в самом начале функции или метода, переменную можно определить непосредственно перед тем, как она будет использоваться. Во-вторых, переменную можно определить внутри блока – группы операторов, заключенных в фигурные скобки. При выходе из блока такая переменная уничтожается еще до окончания выполнения функции. Третьей возможностью временного использования переменной является определение переменной в заголовке цикла for только для итераций этого цикла:
|
Если переменную, определенную внутри функции или блока, описать как статическую, она не будет уничтожаться при выходе из этого блока и будет хранить свое значение между вызовами функции. Однако при выходе из соответствующего блока эта переменная станет недоступна, иными словами, невидима для программы. В следующем примере переменная allAuthors накапливает список авторов книг, переданных в качестве аргументов функции funct за все ее вызовы:
funct(int n, Book[]& bookArray){ for (int i = 0; i < n; i++) { static String allAuthors; allAuthors.Append(bookArray[i].Author()); cout << allAuthors; // авторы всех ранее обработанных книг, в // том числе в предыдущих вызовах функции } cout << allAuthors; // ошибка, переменная недоступна}Общие данные
Иногда необходимо, чтобы к одной переменной можно было обращаться из разных функций. Предположим, в нашей программе используется генератор случайных чисел. Мы хотим инициализировать его один раз, в начале выполнения программы, а затем обращаться к нему из разных частей программы. Рассмотрим несколько возможных реализаций.
Во-первых, определим класс RandomGenerator с двумя методами: Init, для инициализации генератора, и GetNumber — для получения следующего числа.
//// файл RandomGenerator.h//class RandomGenerator{public: RandomGenerator(); ~RandomGenerator(); void Init(unsigned long start); unsigned long GetNumber();private: unsigned long previousNumber;};//// файл RandomGenerator.cpp//#include "RandomGenerator.h"#include <time.h>voidRandomGenerator::Init(unsigned long x){ previousNumber = x;}unsigned longRandomGenerator::GetNumber(void){ unsigned long ltime; // получить текущее время в секундах, // прошедших с полуночи 1 января 1970 года time(<ime); ltime <<= 16; ltime >>= 16; // взять младшие 16 битов previousNumber = previousNumber * ltime; return previousNumber;}Первый вариант состоит в создании объекта класса RandomGenerator в функции main и передаче ссылки на него во все функции и методы, где он потребуется.
|
Поскольку функция main завершает работу программы, все необходимые условия выполнены: генератор случайных чисел создается в самом начале программы, все объекты и функции обращаются к одному и тому же генератору, и генератор уничтожается по завершении программы. Такой стиль программирования допустимо использовать только в том случае, если передавать ссылку на используемый экземпляр объекта требуется нечасто. В противном случае этот способ крайне неудобен. Передавать ссылку на один и тот же объект утомительно, к тому же это загромождает интерфейс классов.
Глобальные переменные
Язык Си++ предоставляет возможность определения глобальной переменной. Если переменная определена вне функции, она создается в самом начале выполнения программы (еще до начала выполнения main). Эта переменная доступна во всех функциях того файла, где она определена. Аналогично прототипу функции, имя глобальной переменной можно объявить в других файлах и тем самым предоставить возможность обращаться к ней и в других файлах:
// файл main.cpp#include "RandomGenerator.h"// определение глобальной переменной RandomGenerator rgen;main(){ rgen.Init(1000);}voidfun1(void){ unsigned long x = rgen.GetNumber();... }// файл class.cpp #include "RandomGenerator.h"// объявление глобальной переменной, // внешней по отношению к данному файлу extern RandomGenerator rgen;Class1::Class1(){...}voidfun2(){ unsigned long x = rgen.GetNumber();... }Объявление внешней переменной можно поместить в файл-заголовок. Тогда не нужно будет повторять объявление переменной с описателем extern в каждом файле, который ее использует.
Модификацией определения глобальной переменной является добавление описателя static. Для глобальной переменной описатель static означает то, что эта переменная доступна только в одном файле – в том, в котором она определена. (Правда, в данном примере такая модификация недопустима – нам-то как раз нужно, чтобы к глобальной переменной rgen можно было обращаться из разных файлов.)
|
|
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!