X::print; // выводим переменную var из пространства имен X
using namespace Y;
var = 9;
print; // выводим переменную var из пространства имен Y
{ using Z::var;
using Z::print;
var = 11;
print; // выводим переменную var из пространства имен Z
}
print; // выводим переменную var из пространства имен Y
X::print; // выводим переменную var из пространства имен X
}
Каждое пространство имен должно содержать определение переменной var
print
, выводящей соответствующую переменную var
в поток cout
.Контрольные вопросы
1. В чем заключается разница между объявлением и определением?
2. Как синтаксически отличить объявление функции от определения функции?
3. Как синтаксически различить объявление переменной от определения переменной?
4. Почему функции из программы, имитирующей работу калькулятора в главе 6, нельзя использовать, не объявив их заблаговременно?
5. Чем является инструкция int a;
6. Почему следует инициализировать переменные при их объявлении?
7. Из каких элементов состоит объявление функции?
8. Какую пользу приносит включение файлов?
9. Для чего используются заголовочные файлы?
10. Какую область видимости имеет объявление?
11. Перечислите разновидности областей видимости. Приведите пример каждой из них.
12. В чем заключается разница между областью видимости класса и локальной областью видимости?
13. Почему программист должен минимизировать количество глобальных переменных?
14. В чем заключается разница между передачей аргумента по значению и передачей аргумента по ссылке?
15. В чем заключается разница между передачей аргумента по значению и передачей по константной ссылке?
16. Что делает функция swap
17. Следует ли определять функцию с параметром типа vector
18. Приведите пример неопределенного порядка выполнения вычислений. Какие проблемы создает неопределенный порядок вычислений?
19. Что означают выражения x&&y
x||y
?20. Соответствуют ли стандарту языка С++ следующие конструкции: функции внутри функций, функции внутри классов, классы внутри классов, классы внутри функций?
21. Что входит в активационную запись?
22. Что такое стек вызовов и зачем он нужен?
23. Для чего нужны пространства имен?
24. Чем пространство имен отличается от класса?
25. Объясните смысл объявления using
26. Почему следует избегать директив using
27. Опишите пространство имен std
Термины
Упражнения
1. Модифицируйте программу-калькулятор из главы 7, чтобы поток ввода стал явным параметром (как показано в разделе 8.5.8). Кроме того, напишите конструктор класса Token_stream
istream&
, так, чтобы, когда вы поймете, как создать свои собственные потоки ввода и вывода (например, с помощью файлов), смогли использовать калькулятор, использующий их.2. Напишите функцию print
cout
вектор целых чисел. Пусть у нее будет два аргумента: строка для комментария результатов и объект класса vector
.3. Создайте вектор чисел Фибоначчи и выведите их на печать с помощью функции из упр. 2. Для того чтобы создать вектор, напишите функцию fibonacci(x,y,v,n)
x
и y
имеют тип int
, аргумент v
является пустой переменной типа vector
, а аргумент n
— это количество элементов, подлежащих записи в вектор v;
элемент v[0]
равен x
, а v[1]
— y
. Число Фибоначчи — это элемент последовательности, в которой каждый элемент является суммой двух предыдущих. Например, последовательность начинается с чисел 1 и 2, за ними следуют числа 1, 2, 3, 5, 8, 13, 21... Функция fibonacci
должна генерировать такую последовательность, начинающуюся с чисел x
и y
.4. Переменная типа int
fibonacci
.5. Напишите две функции, изменяющие порядок следования элементов в объекте типа vector
vector
, а исходный объект класса vector
должен оставаться неизменным. Другая функция должна изменять порядок следования элементов без использования других векторов. (Подсказка: как функция swap
.)6. Напишите варианты функций из упражнения 5 для класса vector