Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 63004
Имитационное мо... 58330
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

Пользователей: 13,091
новичок: avegraf
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных студентов на Delphi (файл записей) + Блок схемы
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...
База данных - словарь терминов на Delphi + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Конструкторы
В первую очередь уделим внимание реализации конструкторов. У нас шесть объявленных конструкторов, седьмой — конструктор копирования — система создаст по умолчанию. Первый — конструктор без аргументов — реализован непосредственно в классе. Этот конструктор просто обнуляет поля с помощью списка инициализации. В остальных конструкторах для обнуления и заполнения массива использована стандартная функция memset (), прототип которой задан в библиотеке <cstring>.
Второй конструктор, показанный в листинге 4.3, позволяет объявить строку, присвоив ей последовательность одинаковых символов, например:
TString d ('-', 60);



Листинг 4.3. Конструктор инициализации последовательностью символов
TString::TString(const char ch, byte count)
{ TString t; // t - обнуляется
t.size = count; // количество символов
memset(t.s,ch,count); // заполнение массива
¦this = t; // копирование в текущий объект
}



В конструкторе объявлен локальный объект, который и заполняется параметрами.
Параметр-количество задан по умолчанию в прототипе, показанном в интерфейсе класса, поэтому этот же конструктор позволяет инициализировать строку единственным символом, например:
Описание основных функций библиотеки <cstring> приведено в приложении.
TString tl = '-•; TString t2 ('+');



Таким образом, этот конструктор является конструктором преобразования из chare TString. К сожалению, он «позволяет» программисту совершить ошибку, например:
TString v(48.'-'); TString w(48);



Эти объявления транслятор посчитает корректными, хотя совершенно очевидно, что программист ошибся. Тут мы опять натыкаемся на «подводный камень» С++, доставшийся в наследство от С, — неявное преобразование типов. Избавиться от этого простыми средствами нельзя, поможет только радикальная мера: определить собственный класс символов с explicit-конструкторами, чтобы запретить неявные преобразования.
Третий конструктор, текст которого приведен в листинге 4.4, — конструктор преобразования. Он позволяет объявлять и инициализировать переменные типа TString константами-строками, например:
TString d = "Строка-инициализатор": TString g("CTpoKa");



Можно в качестве аргумента задать также переменную-указатель на символьный массив, например:
char *v = "Строка-инициализатор": TString w (v): TString z = v;
Листинг 4.4. Конструктор преобразования TString::TString(const char Ss[])
{ TString t; // t - обнуляется
if (strlen(Ss) > 255) t.size = 255; // строка обрезается
else t.size = strlen(Ss); // "нормальная" длина
memcpy(t.s,Ss,t.size); // заполнили массив
¦this = t; // скопировали
}



В конструкторе проверяется длина строки-параметра. Если необходимо, то строка урезается до 255 символов.
Три других конструктора обеспечивают нам инициализацию нашей строки частью строки инициализации. Более интересным является следующий конструктор, в котором в качестве параметров указаны два указателя (листинг 4.5). Этот конструктор позволяет нам создать строку типа TString из любой подстроки символьного массива.

Листинг 4.5. Конструктор инициализации последовательностью символов
TString::TString(const char *First, const char *Last)
{ TString t; // t - обнуляется
if (First < Last) // обязательное условие
{ if (Last - First > 255) t.size = 255; // строка обрезается
else t.size = Last - First; // "нормальная" длина
memcpy(t.s,First,t.size); // заполнили массив
}
¦this = t; // скопировали



При задании аргументов обязательно выполнение условия (First < Last), то есть элемент *Last не включается в создаваемую строку. Именно такой способ задания параметров встречается в стандартной библиотеке шаблонов (Standard Template Library, STL), только в библиотеке обычно используются не указатели, а итераторы*.
Такой конструктор позволяет нам объявлять наши строки следующим образом:
char *v = "Строка-инициализатор":
TString vss(v, v+6); // vss = "Строка"
TString wss(v+7, v+strlen(v)); // wss = "инициализация"
TString tss(v+4, v+9); // tss = "ка-ин"



В качестве параметров в этом случае можно задавать любые разрешенные формы указателей. Например, можно не объявлять константу-строку, а задать ее непосредственно в качестве параметра при объявлении:
TString rr("0123456789"+3."0123456789"+6); Переменная г г получит значение «345».



Пятый конструктор позволяет нам тоже инициализировать нашу строку подстрокой символьного массива, при этом подстрока задается индексом первого символа и количеством символов. Если последний параметр используется по умолчанию, то с помощью этого конструктора мы можем задать подстроку от заданного символа до конца строки инициализации. Текст конструктора представлен в листинге 4.6.

Листинг 4.6. Конструктор инициализации подстрокой символьного массива
TString::TString(const char S[], byte index, byte count)
{ TString t(S+index, S+index+count); // все проверки
¦this - t;
}



В этом конструкторе параметры проверяются при создании локального объекта. Если параметры заданы с ошибками, то, как всегда, возвращается пустая строка.
Шестой конструктор позволяет нам инициализировать новую строку подстрокой из ранее объявленной строки (листинг 4.7).

Листинг 4.7. Конструктор инициализации из ранее объявленной строки
TString::TString(const ^String &S, byte index, byte count) { TString t;
if ( (count > S.size)|| (index+count > S.size))
t.size = S.size-index; // неправильное количество
else t.size = count; if (t.size>0)
memcpy(t.s,(S.s+index).t.size); // копируем строку
¦this = t; // заменяем текущий объект
1 Итераторы описываются в главе 6.
}



Необходимо отметить, что в конструкторах довольно серьезно проверяются параметры. Однако сообщить программе-клиенту об ошибке параметров конструктор не в состоянии — отсутствует возвращаемое значение. Если у вас есть ребенок девочка, тогда что бы она вам не мешала при программировании нужно ей показать лучшие игры для девочек тут. Здесь вы найдете разные игры для девочек например тесты - Воронины и другие.
А если мы определим лишний параметр, то у нас не будет возможности объявить объект без инициализации, и мы тем самым грубо нарушим один из принципов синтаксиса: объявление объектов новых типов не должно отличаться от объявлений встроенных типов. Решить эту проблему можно только с помощью механизма обработки исключений (см. главу 7).
Опубликовал Kest September 17 2013 18:26:47 · 0 Комментариев · 2340 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Паскаль и Дельфи....
CaptionButton
ИНТЕРНЕТ ПРОГРАММ...
XPButtons
DAlarm
Просмотр коммент...
Программирование ...
Encrypt Decrypt
С/C++ Программиро...
Assembler. Практикум
Правила программи...
Borland Delphi 8 ...
Plasma
Delphi7 Для профе...
IPAddresseEdit
XPmenu
Autorunner
TrayComp
Программа предназ...
Report

Топ загрузок
Приложение Клие... 100479
Delphi 7 Enterp... 87859
Converter AMR<-... 20082
GPSS World Stud... 13492
Borland C++Buil... 12055
Borland Delphi ... 8668
Turbo Pascal fo... 7048
Visual Studio 2... 5005
Калькулятор [Ис... 4908
FreeSMS v1.3.1 3545
Случайные статьи
Классификация устр...
Множество. Определ...
6.9. Ввод и вывод...
Интервалы между сл...
Ручная и автомати...
Карта START
Ушу СПб
ИНФОРМАЦИОННАЯ БЕЗ...
Циклические коды и...
Если первая буква ...
Различия во встрое...
А вот что говоритс...
Ограничения и расш...
Методы доказательс...
Работа с внешней п...
Широкие файловые п...
Какие ещё варианты...
Определение размер...
Система SVR4/MP и ...
Еще один пример ас...
Ограничение объясн...
Инкапсуляция и С++
Лучшая реклама слу...
РАБОТА С ГРАФИКОЙ ...
Батуты в СПб попры...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?