![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
15 - Область видимости. Продолжение 2 / MSDN rus / Visual C++ |
![]() |
Шаг 15 - Область видимости. Продолжение 2Самое прикольное, что и в этой простой ситуации базар еще не окончен. Лексиконом буду :-). Так вот присмотритесь к коду ниже. Здесь нет ни одной ошибки. int i; void main() { int i; i=5; } void inf() { i=7; } По логике рассказанного компилятор должен был заверищать о том, что в данном случае два имени. Ведь в main объявлено имя, которое есть в более высокой области. А нет !!! Все сложнее в нашем варианте с функциями. Логика такая. Если имя объявлено в осласти CPP и не объявлено в функции, то используется более глобальная переменная, если имя объявлено в функции, то локальное. Смотрите на main в данном случае присвоение i=5 не изменит i глобальную. Почему ??? Потому, что имя объявленно в функции. А в inf изменит потому, что имя в функции не объявлено и компилятор использует глобальное имя. Пора кричать бардак. Мы запутаемся !!! Запутаетесь. Получается, что объяви в функции имя то же самое, что и глобальное на уровне CPP, то про последнее можно забыть ??? А вот нет. Есть такой хитрый ход, который явно меняет уровень видимости. Что выведется в данному случае ??? int i; void main() { int i; ::i=5; i=10; cout << ::i; } Выведется 5. А вот в этом ??? int i; void inf(); void main() { int i; inf(); i=10; cout << ::i; } void inf() { i=5; } То же выведется 5. Почему ??? Так вот этот знак :: говорит о том, что чихать на то, что объявлено в функции и пользоваться уровнем CPP. Кстати обратите внимание на то, что мне пришлось объявить функцию inf это все из-за правила выше. Вот в таком варианте объявлять не надо. int i; void inf() { i=5; } void main() { int i; inf(); i=10; cout << ::i; } Надо сделать вывод, что объявления без реализации созданы, чтобы избежать проблем следования друг за другом. В чем заключается ошибка следования ??? Смотрите. void a1() { a2(); } void a2() { a1(); } Такой вызов функций не запрещен, но он не возможен, если нельзя сначала определить, а потом реализовать. Я немного отвлекся для демонстрации подхода к реализации и объявлениям. Ну ладно. Это для пояснения сути проблеммы, так как следование влияет на видимость. | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|