Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #58, ОКТЯБРЬ 2003 г.

Сколько плюсов у 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; }

Теперь нетрудно догадаться, как реализовать сокрытие данных с помощью пространств имен. Рассмотрим модуль "строка символов". На самом деле в реальных программах так делать не надо :), это лишь наглядный пример. Сначала объявим пользовательский интерфейс.

Назад на стр. 058-090-1  Содержание  Вперед на стр. 058-090-3