Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



Конструктор копирования для контейнерного класса



Конструктор копирования предназначен для создания объектов данного класса путем копирования данных из другого, уже существующего объекта этого класса. Такие конструкторы особенно целесообразны для создания копий объектов, которые моделируют динамические структуры данных. Однако, по умолчанию компилятор создает так называемые конструкторы поверхностного копирования (shallow copy constructors), которые копируют только члены данных. Поэтому если какие-то члены данных содержат указатели, сами данные не будут копироваться. Для реализации "глубокого" копирования в код конструктора надо включить соответствующие инструкции.

Чтобы производные классы были не просто удобной формой краткого описания, в реализации языка

должен быть решен вопрос: к какому из производных классов относится объект, на который смотрит

указатель base*? Существует три основных способа ответа:

[1] Обеспечить, чтобы указатель мог ссылаться на объекты только одного типа ($$6.4.2);

[2] Поместить в базовый класс поле типа, которое смогут проверять функции;

[3] использовать виртуальные функции ($$6.2.5).

Указатели на базовые классы обыкновенно используются при проектировании контейнерных классов

(множество, вектор, список и т.д.). Тогда в случае [1] мы получим однородные списки, т.е. списки

объектов одного типа. Способы [2] и [3] позволяют создавать разнородные списки, т.е. списки объектов

нескольких различных типов (на самом деле, списки указателей на эти объекты). Способ [3] - это

специальный надежный в смысле типа вариант способа [2]. Особенно интересные и мощные варианты

дают комбинации способов [1] и [3]; они обсуждаются в главе 8.

Вначале обсудим простой способ с полем типа, т.е. способ [2]. Пример с классами manager/employee

можно переопределить так:

struct employee {

enum empl_type { M, E };

empl_type type;

employee* next;

char* name;

short department;

// ...

};

struct manager : employee {

employee* group;

short level;

// ...

};

 

Контейнерные классы -- это универсальные шаблонные классы, предназначенные для хранения элементов заданного типа в смежных областях памяти. Стандарт C++ уже включает в себя большое количество контейнеров, как часть STL (Standard Template Library -- Стандартная Библиотека Шаблонов).

Qt имеет свой набор шаблонных классов. Таким образом, при создании программ разработчик может использовать как контейнерные классы из библиотеки Qt, так и классы из STL

Вектор – это контейнерный класс, в котором доступ к его элементам осуществляется по индексу. В силу этого векторы во многом напоминают одномерные массивы. Библиотека STL предоставляет вам контейнерный класс vector, определенный в заголовочном файле и доступный в пространстве имен std. Класс vector ведет себя подобно массиву, однако предоставляет больше возможностей по управлению ним. В частности, вектор можно наращивать по мере небходимости, и он обеспечивает контроль значений индексов. Определение класса vector выглядит следующим образом:

template >

class vector

{

// члены класса

}

 

 

Конструкторы и деструкторы.

Если у класса есть конструктор, он вызывается всякий раз при создании объекта этого класса. Если у

класса есть деструктор, он вызывается всякий раз, когда уничтожается объект этого класса. Объект

может создаваться как:

[1] автоматический, который создается каждый раз, когда его описание встречается при

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

[2] статический, который создается один раз при запуске программы и уничтожается при ее

завершении;

[3] объект в свободной памяти, который создается операцией new и уничтожается операцией

delete;

[4] объект-член, который создается в процессе создания другого класса или при создании массива,

элементом которого он является.

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

или как временный объект . В обоих случаях такой объект не имеет имени.

Ø Конструктор представляет собой метод класса, который облегчает вашим программам инициализацию элементов данных класса.

Ø Конструктор имеет такое же имя, как и класс.

Ø Конструктор не имеет возвращаемого значения.

Ø Каждый раз, когда ваша программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует.

Ø Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта.

Ø Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (~).

Ø Деструктор не имеет возвращаемого значения.

 



Просмотров 890

Эта страница нарушает авторские права




allrefrs.su - 2024 год. Все права принадлежат их авторам!