|
Программирование >> Немодифицирующие последовательные алгоритмы
void Pair<T>::showQ() { cout x/y endl; } int mainO { Pair<double> a(37.0, 5.0); Pair<int> u(37, 5); a.showQ(); u.showQ(); return 0; Способ, каким функции-члены шаблонного класса, в этом примере showQ, определены вне класса, может с первого взгляда показаться сложным. Но на самом деле эта конструкция весьма логична: имя любой функции-члена, когда эта функция определяется вне класса, должно быть предварено выражением type:: И вполне резонно, что вместо type в нашем случае мы пишем Pair<T>. Кроме того, как пользователи STL мы можем не беспокоиться об определениях, так как шаблонные классы STL доступны в виде файлов заголовков, которые можно использовать, не вдаваясь в подробности их программирования. Единственный аспект применения шаблонов, который мы увидим в наших программах,- это обозначение фактического типа с помощью конструкции наподобие Pair<double>. Пространства имен Существует другой новый элемент языка, который мы обязаны принять во внимание. Если программа состоит из многих файлов, мы должны принять меры во избежание конфликта имен. Концепция пространства имен может быть хорошим способом решения этой задачи. В нижеприведенной программе определены две глобальные переменные г, которые не находятся в конфликте, потому что существуют в различных пространствах имен: namespac.cpp: Концепция пространства имен, tinclude <iostream.h> namespace А { int i = 10; } namespace В { int i = 20; } void fA() { using namespace A; cout << In fA: << A::i << << B::i << << i endl; void fB() { using namespace B; cout << In fB: << A::i << B::i << i endl; int mainO { fA(); fB(); cout << In main: << A::i << B::i << endl; cout i endl; Здесь это недопустимо. using A::i; cout << i << endl; A это разрешено, return 0; Эта программа на выходе даст: In fA: 10 20 10 In fB: 10 20 20 In main: 10 20 10 Благодаря идентификаторам An В мы впоследствии можем ссылаться на эти пространства имен. Для пространства имен А можем написать либо что-нибудь вроде А: : ... либо одно из выражений: using namespace А; using А::i; Только после использования одного из двух последних выражений неквалифицированный идентификатор i будет относиться к переменной i (со значением 10), определенной в пространстве имен А. Результат работы программы наглядно демонстрирует это. Тип bool: синоним для int или встроенный тип? Тип bool и два его возможных значения, true и fabe, определены в файлах заголовка первоначальной версии STL с помощью приема, который часто можно встретить в программах на С: #define bool int #define true 1 #define false 0 Однако в соответствии с проектом стандарта С++ bool является встроенным типом, что подразумевает: следующая программа, вообще не использующая файлы заголовков, должна компилироваться без ошибок: int main О { bool b; return 0; Некоторые старые компиляторы отвергнут эту программу, поскольку они не распознают bool в качестве встроенного типа. В соответствии с проектом стандарта С++ типы bool и int не являются идентичными, что проиллюстрируем следующими (типичными) выходными результатами программы boolint.cpp: sizeoffbool) = 1 sizeofdnt) = 4 With В defined as bool B[100], we have sizeoffB) = 100 Программа, которая выводит такие результаты, приведена ниже: boolint.cpp: Типы bool и int различны. #include <iostream.h> int main О { cout << sizeof(bool) = << sizeof(bool) << endl; cout << sizeof (int) = sizeofdnt) << endl; bool B[100]; cout << With В defined as bool B[100], we have\n ; cout << sizeof(B) = sizeof(B) << endl; return 0; Очевидно, каждый элемент массива значений типа bool занимает один байт, тогда как при размере машинного слова в 32 бита он занимал бы 4 байта, если бы типы bool и int не различались. Можно представить еще более экономную реализацию, когда восемь булевских значений размещаются в одном байте, но это замедлило бы операции с этими элементами. В следующем разделе мы обсудим дополнительные различия между версиями С++ (а также STL).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |