Сколько плюсов у C++? AvaLANche Xakep, номер #058, стр. 058-090-2 bool quit () { char ans; // сюда мы сохраним ответ for (int tries = 0; tries <= 5; tries++) { // спрашивать будем в цикле cout << "Вы действительно хотите выйти (y/n)? "; // cout - стандартный поток вывода cin >> ans; // cin - стандартный поток ввода switch (ans) { case 'y': return true; // bool может быть только true case 'n': cout "А зря!\n"; return false; // или false default: cout "Повторяю вопрос:\n"; } } cout "Все равно выходим!\n"; return false; } Модули и пространства имен Процедурное программирование - основа основ, его стали применять в первых программах для первых ЭВМ. Но ничто не стоит на месте: сложность программ росла, и со временем важным вопросом стала организация данных. Так появились модули - набор процедур вместе с данными, которые они обрабатывают. Стал актуален принцип сокрытия: "организуй код в модулях так, чтобы скрыть в них данные". На первый взгляд не совсем понятно, что и зачем нужно скрывать. Ответ прост: пользователю функций (хотя это такой же программер, как и их разработчик, назовем его так) не интересно, как они работают, для него главное, чтобы они действительно работали. Поэтому разработчик предоставляет пользователю некий интерфейс (пользовательский) - все, что необходимо для вызова данного набора функций (модуля). Реализация же этих функций не видна пользователю - она скрыта. По этому принципу построено большинство библиотек (например, WinAPI, где код функций находится в системных dll'ках, а программисты знают о них из заголовочных файлов типа windows.h). На самом деле модульное программирование не новость и для С-кодеров, но они вынуждены обходиться простой раздельной компиляцией (несколько .c-файлов) и заголовочными .h-файлами. Все объявленные переменные в хидерных файлах оставались по-прежнему глобальными, и к ним можно было легко обратиться из любого места программы. В С++ появилась такая полезная вещь, как пространства имен (namespaces). Объявляя пространство имен, ты, по сути, "ограничиваешь область видимости" всему, что находится внутри него. А внутри может находиться любое объявление. Например, у нас есть пространство имен A, содержащее переменную c == 100, и есть глобальная переменная c == 0. Тогда функции f() и g() выведут 100, а h() - 0: int c = 0; namespace A { int c = 100; void f () { cout << c; } } void g () { cout << A::c; } void h () { cout << c; } Здесь A::c означает, что c берется из пространства имен A. Если бы мы захотели обратиться к глобальной с из функции f (), нам пришлось бы использовать квалификатор глобального namespace'а: void f () { cout << ::c; } Теперь нетрудно догадаться, как реализовать сокрытие данных с помощью пространств имен. Рассмотрим модуль "строка символов". На самом деле в реальных программах так делать не надо :), это лишь наглядный пример. Сначала объявим пользовательский интерфейс. |