Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Листинг 15.1. Класс string






    1: #include < iostream.h>

    2: #include < string.h>

    3:

    4: class String

    5: {

    6: public:

    7: // конструкторы

    8: String();

    9: String(const char *const);

    10: String(const String &)

    11: ~String();

    12:

    13: // перегруженные операторы

    14: char & operator[](int offset);

    15: char operator[](int offset) const;

    16: String operator+(const String&);

    17: void operator+=(const String&);

    18: String & operator= (const String &);

    19:

    20: // Общие методы доступа

    21: int GetLen()const { return itsLen; }

    22: const char * GetString() const { return itsString; }

    23: // статический целочисленный счетчик ConstructorCount;

    24:

    25: private:

    26: String (int); // закрытый конструктор

    27: char * itsString;

    28: unsigned short itsLen;

    29:

    30: };

    31:

    32: // конструктор класса String пo умолчанию создает строку длиной 0 байт

    33: String:: String()

    34: {

    35: itsString = new char[1];

    36: itsString[0] = '\0';

    37: itsLen=0;

    38: // cout < < " \tDefault string constructor\n";

    39: // ConstructorCount++;

    40: }

    41:

    42: // закрытый конструктор, используемый только

    43: // методами клаcса для создания новой cтроки

    44: // указанного размера, заполненной нулями

    45: String:: String(int len)

    46: {

    47: itsString = new ohar[len+1];

    48: for (int i = 0; i< =len; i++)

    49: itsString[i] = '\0';

    50: itsLen=len;

    51: // cout < < " \tString(int) constructor\n";

    52: // ConstructorCount++;

    53: }

    54:

    55: // Преобразует массив символов в cтроку

    56: String:: String(const char * oonst cString)

    57: {

    58: itsLen = strlen(cString);

    59: itsString = new char[itsLen+1];

    60: for (int i = 0; i< itsLen; i++)

    61: itsString[i] = cString[i];

    62: itsString[itsLen]='\0';

    63: // cout < < " \tString(char*) constructor\n";

    64: // ConstructorCount++;

    65: }

    66:

    67: // конструктор-копировщик

    68: String:: String (const String & rhs)

    69: {

    70: itsLen=rhs.GetLen();

    71: itsString = new char[itsLen+1];

    72: for (int i = 0; i< itsLen; i++)

    73: itsString[i] = rhs[i];

    74: itsString[itsLen] = '\0';

    75: // cout < < " \tString(String&) constructor\n

    76: // ConstructorCount++;

    77: }

    78:

    79: // деструктор освобождает занятую память

    80: String:: ~String ()

    81: {

    82: delete [] itsString;

    83: itsLen = 0;

    84: // cout < < " \tString destructor\n";

    85: }

    86:

    87: // этот оператор освобождает память, а затем

    88: // копирует строку и размер

    89: String& String:: operator=(const String & rhs)

    90: {

    91: if (this == & rhs)

    92: return *this;

    93: delete [] itsString;

    94: itsLen=rhs.GetLen();

    95: itsString = new char[itsLen+1];

    96: for (int i = 0; i< itsLen; i++)

    97: itsString[i] = rhs[i];

    98: itsString[itsLen] = '\0';

    99: return *this;

    100: // cout < < " \tString operator=\n";

    101: }

    102:

    103: // неконстантный оператор индексирования,

    104: // возвращает ссылку на символ, который можно

    105: // изменить

    106: char & String:: operator[](int offset)

    107: {

    108: if (offset > itsLen)

    109: return itsString[itsLen-1];

    110: else

    111: return itsStnng[offset];

    112: }

    113:

    114: // константный оператор индексирования,

    115: // используется для константных объектов (см. конструктор-копировщик!)

    116: char String:: operator[](int offset) const

    117: {

    118: if (offset > itsLen)

    119: return itsString[itsLen-1];

    120: else

    121: return itsString[offset];

    122: }

    123:

    124: // создает новую строку, добавляя текущую

    125: // строку к rhs

    126: String String:: operator+(const String& rhs)

    127: {

    128: int totalLen = itsLen + rhs.GetLen();

    129: String temp(totalLen);

    130: int i, j;

    131: for (i = 0; i< itsLen; i++)

    132: temp[i] = itsString[i];

    133: for (j = 0: j< rhs.GetLen(); j++, i++)

    134: temp[i] = rhs[j];

    135: temp[totalLen]='\0';

    136: return temp;

    137: }

    138:

    139: // изменяет текущую строку, ничего не возвращая

    140: void String:: operator+=(const String& rhs)

    141: {

    142: unsigned short rhsLen = rhs.GetLen();

    143: unsigned short totalLen = itsLen + rhsLen;

    144: String temp(totalLen);

    145: int i, j;

    146: for (i = 0; i< itsLen; i++)

    147: temp[i] = itsString[i];

    148: for (j = 0; j< rhs.GetLen(); j++, i++)

    149: temp[i] = rhs[i-itsLen];

    150: temp[totalLen]='\0';

    151: *this = temp;

    152: }

    153:

    154: // int String:: ConstructorCount = 0;

     

    Результат:

    Нет

     

    Анализ: Представленный в листинге 15.1 класс String напоминает другой класс, использованный в листинге 12.12. Однако есть одно важное отличие между этими двумя классами: конструкторы и некоторые функции листинга 12.12 включали операторы вывода на печать, благодаря которым на экране отображались сообщения об их использовании. В листинге 15.1 эти операторы временно заблокированы, но они будут использоваться в следующих примерах.

    Статическая переменная-член ConstructorCount объявляется и инициализируется соответственно в строках 23 и 154. Значение этой переменной увеличивается на единицу при вызове любого конструктора класса String. Эти функции также заблокированы и будут использоваться в следующих листингах.

    В листинге 15.2 объявляется класс Employee, содержащий три объекта класса String.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.