Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

1.5. Классы 39

Инициализация участников класса со списками инициализатора

Есть тонкость, которую мы замяли в наших представлениях конструкторов. Вспомните, что последовательность - класс в стандартной библиотеке шаблона. Наша инициализация, используя «name=nm» выше полагавшегося факт, что классу последовательности определили оператора назначения для него. Если тип имени - класс без оперы назначения - скалистая вершина, этот тип инициализации не мог бы быть возможным. Чтобы иметь дело с проблемой инициализации членских переменных, которые являются самостоятельно классами, C ++ обеспечивает изменение - nate метод инициализации, названной списком инициализатора. Этот список помещен между списком аргументов конструктора и его телом. Это состоит из двоеточия (:) сопровождаемый отделенным от запятой списком членского имени формы (начальное значение). Чтобы иллюстрировать особенность, давайте перепишем второго Пассажирского конструктора так, чтобы ее первые три мадам - bers были инициализированы списком инициализатора. Список инициализатора выполнен перед телом конструктора.

//конструктор, использующий список инициализатора

Пассажир:: Пассажир (константа string& nm, член парламента MealType, натягивают fn),

: имя (nm), mealPref (член парламента), isFreqFlyer (fn! = «НИ ОДИН»)

freqFlyerNo = fn;

Печи для сжигания отходов производства

Конструктора называют, когда объект класса появляется. Печь для сжигания отходов производства - членская функция, которая автоматически вызвана, когда объект класса прекращает существование. Если объект класса появится, динамично используя нового оператора, то печь для сжигания отходов производства назовут, когда этот объект будет разрушен, используя удалить оператора. Если объект класса появится, потому что это - местная переменная в функции, которая была вызвана, то печь для сжигания отходов производства назовут, когда функция возвратится. Печь для сжигания отходов производства для класса T обозначена ~T. Это не берет аргументов и не имеет никакого типа возвращения. Печи для сжигания отходов производства необходимы, когда классы ассигнуют ресурсы, такие как память, от системы. Когда объект прекращает существование, это - обязанность печи для сжигания отходов производства возвратить эти ресурсы к системе.

Давайте считать класс Vect, показанным в следующем кодовом фрагменте, который хранит вектор, динамично ассигнуя множество целых чисел. На динамическое множество ссылаются членские данные о переменной. (Вспомните из Раздела 1.1.3, что dy-namically ассигновал множество, представлен указателем на его начальный элемент.) Членский размер переменной хранит ряд элементов в векторе. Конструктор для этого класса ассигнует множество желаемого размера. Чтобы возвратить это пространство к системе, когда объект Vect удален, мы должны обеспечить, печь для сжигания отходов производства, чтобы иметь дело - определяют местонахождение этого пространства. (Вспомните, что, когда множество удалено, мы используем, «удаляют []», вместо того, чтобы «удалить».)

40

класс Vect

общественность:

Vect (интервал n); ˜Vect ();//... опущены другие общественные участники

частный:

интервал* данные; интервал размер;

;

//

// //

// //

Глава 1. C ++ учебник для начинающих

векторный класс

конструктор, данный печь для сжигания отходов производства размера

множество, держащее векторное число записей множества

Vect:: Vect (интервал n) //конструктор

размер = n;

данные = новый интервал [n]; //ассигнуют множество

Vect:: ˜Vect ()

удалите [] данные;

//печь для сжигания отходов производства//освобождает ассигнованное множество

Мы строго не требуемся C ++, чтобы обеспечить нашу собственную печь для сжигания отходов производства. Тем не менее, если наш класс ассигнует память, мы должны написать печь для сжигания отходов производства, чтобы освободить эту память. Если бы мы не обеспечивали печь для сжигания отходов производства в примере выше, удаление объекта типа, то Vect вызвал бы утечку памяти. (Вспомните из Раздела 1.1.3, что это - недоступный блок памяти, которая не может быть удалена). Работа по явному освобождению объектов, которые были ассигнованы, является одной из работы по дому, которую должен вынести C ++ программисты.

1.5.3 Классы и распределение памяти

Когда класс выполняет распределение памяти, использующее новый, заботу нужно соблюдать, чтобы избежать

много общих программных ошибок. Мы показали выше того отказа освободить хранение в печи для сжигания отходов производства класса, может привести к утечкам памяти. Несколько больше коварной проблемы происходит, когда классы, которые ассигнуют память, не предоставляют конструктору копии или оператору назначения. Рассмотрите следующий пример, используя наш класс Vect.

Vect (100);

//

вектора размера 100

Vect b = a;

//

инициализируйте b от (ОПАСНОСТЬ!)

Vect c;

//

c - вектор (размер по умолчанию 10)

c = a;

//

назначьте на c (ОПАСНОСТЬ!)

Казалось бы, что мы только что создали три отдельных вектора, весь размер 100, но имеем нас? В действительности все три из этих векторов разделяют то же самое множество с 100 элементами. Давайте посмотрим, почему это произошло.