Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 28

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 22 23 24 25 26 27 < 28 > 29 30 31 32 33 34 .. 204 >> Следующая

Примечание
Если локальная переменная объявлена как статическая (ключевое слово static), то она создается и инициализируется только один раз, когда программное управление впервые достигает оператора объявления переменной.
Обратите внимание: если объявление переменной содержит инициализацию, то необходимо убедиться не пропущен ли оператор объявления, как в следующей конструкции switch, компиляция которой вызывает сообщение об ошибке.
switch (Code) {
case 1: // . . .
break;
case 2:
int Count =0; // ошибка
// ...
break;
case 3: // ...
break;
}
Компилятор генерирует ошибку по следующей причине: переменная Count инициализируется только тогда, когда управление достигает ветви case 2 оператора switch. Если управление передается ветви case 3, содержащей обращение к переменной Count, то она не будет инициализирована. Ветвь case 3 имеет доступ к переменной Count, так как объявление переменной предшествует данной ветви внутри того же блока. Компилятор сгенерирует ошибку, даже если код в этой ветви действительно не использует переменную Count. Важен факт, что использование возможно. Для исправления ошибки нужно поместить код ветви case 2 внутри ее собственного блока, например:
case 2: {
int Count = 0; // ... break;
}
В таком варианте оператора switch ссылаться на переменную Count можно только внутри ветви case 2. В противном случае можно убрать инициализацию из объявления и присвоить переменной Count начальное значение.
case 2:
int Count; Count = 0; // ... break;
Операция расширения области видимости
При объявлении внутри некоторой области видимости переменной с таким же именем, как у переменной во внешней области, переменная во внутренней области скрывает переменную, находящуюся во внешней области видимости. Таким образом, внутри области видимости имя переменной будет содержать ссылку на другой объект. Например, в следующем коде переменная А типа int, объявленная внутри функции main, скрывает переменную А типа double, объявленную снаружи, и присваивание внутри функции изменяет значение переменной А типа int, но не типа double.
double А;
void main () {
int A;
A = 5; // присваивает значение 5 переменной А типа int }
Однако в языке С++ можно организовать доступ к глобальной переменной (т.е., переменной, объявленной снаружи любой функции), даже если она скрыта локальной с аналогичным именем. Для этого перед именем переменной указывается оператор расширения области видимости ::, например:
double А; // глобальная переменная А
void main () {
int А; // локальная переменная А
А = 5; // присваивает значение 5 локальной переменной А // типа int
: :А = 2.5; // присваивает значение 2,5 глобальной // переменной А типа double
}
Обратите внимание: операция расширения области видимости используется только для организации доступа к глобальной переменной. Данную операцию нельзя использовать для доступа к локальной переменной, объявленной внутри блока, как в следующем примере некорректного кода:
void FuncX (int Code) f
double A;
if (Code == 1) {
int A;
// попытка доступа к переменной А типа double во внешнем блоке: : :А = 2.5; // ОШИБКА: : :А описывает глобальную
// переменную А, что неправильно, если А не
// объявлена на глобальном уровне
//...
}
//. . .
}
Операцию расширения области видимости можно также использовать для доступа к глобальной переменной или перечислению, скрытым локальной переменной или перечислением с аналогичными именами. Например:
#include <iostream.h>
typedef int A; enum (Red, White, Blue);
void main () f
typedef double A;
enum (Blue, White, Red);
cout « sizeof (A) « ' \n'; // А типа double
cout « sizeof (::A) « ' \n'; //А типа int
cout « ( int ) Blue « ' \n ' ;
cout « (int):: Blue « '\n';
}
Примечание
В двух следующих главах вы узнаете еще несколько способов применения операции расширения области видимости, относящихся к классам С++.
Встроенные функции
Если объявить функцию с использованием ключевого слова inline, как это сделано в приведенном ниже примере, компилятор попытается заменить все ее вызовы фактическим кодом функции.
inline int FuncA (int X) {
// код функции ...
}
Замена вызовов функции копией кода функции называется макрорасширением (inline expansion) или просто встраиванием (Mining).
Примечание
Директива inline, эквивалентная специфической директиве Microsoft inline, не гарантирует, что функция будет реализована как встроенная. В некоторых ситуациях компилятору может понадобиться сгенерировать обычный вызов функции, например, если она рекурсивная (т.е. вызывающая саму себя) или вызывается указателем функции. Можно с помощью компилятора выполнить встраивание функции (если это возможно), используя
директиву Microsoft_forceinline. Дополнительную информацию по использованию этих
директив можно найти в разделах справочной системы Visual С++ Documentation, Reference,
// печатает размер переменной
// печатает размер переменной
// печатает О // печатает 2
C/C++ Language and С++ Libraries, C/C++ Language Reference, Declaration, Specifiers, Function Specifiers
Предыдущая << 1 .. 22 23 24 25 26 27 < 28 > 29 30 31 32 33 34 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100