Наши функции перевода регистра должны обеспечивать перевод и русских, и английских букв. Простейшая реализация методов преобразования в верхний и нижний регистры может быть такой, как в листинге 4.19. Поскольку перевод регистра — разовое действие, то пусть обе операции возвращают значение.
Листинг 4.19. Простейшая реализация методов изменения регистра строки
TString TString::operator++() // toUpper { const char lower[59]
= "abcdefghi ]к1тпоряг51иуихугабвгдежзийклмнопрстуфхцчшщъыьэюя,>;
Подробности см. в главе 14.
const char upper[59]
= ,,ABCDEFGHIJKLMN0PQRSTUVWXYZAБBГДEЖЗИЙKПMH0ПPCTУФXЦЧШЩЪЫbЭЮЯ,,; for(int i = 0; i<this->Length(); i++)
{ for (int j = 0; J < 59; j++) if (s[i] == lower[j]) s[i}=upper[j]; } return *this;
}
TString TString:roperator--() // toLower { const char lower[59]
= "abcdefghi j^тпорд^иуыхугабвгдежзийклмнопрстуфхцчшщъыьэюя"; const char upper[59]
= "АВСОЕРСНиКЬММОРОКБТиУУ^ХУГАБВГДЕЖЗИЙКПМНОПРСТУФХЦЧШЩЬЫЬЭЮЯ"; for(int i = 0; i<this->Length(); i++)
{ for (int j = 0; j < 59; j++) if (s[i] == upperfj]) s[iSlower[j]; } return *this;
}
Методы прекрасно работают, однако в таком виде они нас, конечно, не устраивают — любой программист тут же скажет, что использование локальных массивов очень неэффективно. Массивы заново создаются при каждом входе в функцию — на это тратится и время и место при выполнении программы.
Первое побуждение — вынести массивы из методов и объявить два поля-массива. Но тут нас ожидают некоторые сложности. Во-первых, поля нельзя объявить константными, хотя по сути своей они таковыми и являются. Дело в том, что тогда мы не сможем эти поля инициализировать — константные массивы встроенного типа никаким образом не инициализируются (см. ранее). Но если массивы не константные, то их придется заполнять в каждом конструкторе, написав для этого приватную функцию.
Во-вторых, и это гораздо важнее, неконстантные поля-массивы существенно увеличивают размер класса — на 118 байт. Пока объектов немного, это не доставляет беспокойства. Но представьте, что нам надо объявить массив размером в 1000 элементов типа TStr i ng. Ситуация отнюдь не надуманная, так как подобный массив, например, в качестве буфера может использовать простой текстовый редактор. Но такой массив имеет уже 118 ООО лишних байтов, которые еще и заполняются во время создания — ведь конструктор вызывается для каждого элемента массива. Ситуация совершенно неприемлемая как с точки зрения расхода памяти, так и с точки зрения эффективного выполнения программы.
Программистам просто необходимы качественные и не дорогие дисплеи, которые можно купить в интернет магазине http://vseplus.com/product?cid=35.
Так как массивы у нас символьные, то можно было бы обойтись указателями на символ — тем более, что их можно инициализировать символьной константой. Ситуация с памятью несколько улучшается: два указателя занимают в классе всего 8 байт. Однако указатели тоже будут инициализироваться для каждого создаваемого объекта. |