Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы 13-22.doc
Скачиваний:
17
Добавлен:
21.07.2019
Размер:
200.19 Кб
Скачать

14. Наследование. Конструкторы и деструкторы.(вариант 2)

Конструктор.

При определении класса имеется возможность задать для объекта начальное значение. Специальный метод класса, называемый конструктором, выполняется каждый раз, когда создается новый объект этого класса. Конструктор – это метод, имя которого совпадает с именем класса. Конструктор не возвращает никакого значения. Для класса String имеет смысл в качестве начального значения использовать пустую строку: class String { public: String(); // объявление конструктора }; // определение конструктора String::String() { str = 0; length = 0; } Определив такой конструктор, мы гарантируем, что даже при создании автоматической переменной объект будет соответствующим образом инициализирован (в отличие от переменных встроенных типов). Конструктор без аргументов называется стандартным конструктором или конструктором по умолчанию. Можно определить несколько конструкторов с различными наборами аргументов. Возможности инициализации объектов в таком случае расширяются. Для нашего класса строк было бы логично инициализировать переменную с помощью указателя на строку. class String { public: String(); // стандартный конструктор String(const char* p); // дополнительный конструктор }; // определение второго конструктора String::String(const char* p) { length = strlen(p); str = new char[length + 1]; if (str == 0) { // обработка ошибок } strcpy(str, p); // копирование строки } Теперь можно, создавая переменные типа String, инициализировать их тем или иным образом: char* cp; // выполняется стандартный конструктор String s1; // выполняется второй конструктор String s2("Начальное значение"); // выполняется стандартный конструктор String* sptr = new String; // выполняется второй конструктор String* ssptr = new String(cp);

Деструкторы Аналогично тому, что при создании объекта выполняется конструктор, при уничтожении объекта выполняется специальный метод класса, называемый деструктором. Обычно деструктор освобождает ресурсы, использованные данным объектом. У класса может быть только один деструктор. Его имя – это имя класса, перед которым добавлен знак "тильда" ‘~’. Для объектов класса String деструктор должен освободить память, используемую для хранения строки: class String { ~String(); }; String::~String() { if (str) delete str; } Если деструктор в определении класса не объявлен, то при уничтожении объекта никаких действий не производится. Деструктор всегда вызывается перед тем, как освобождается память, выделенная под объект. Если объект типа String был создан с помощью операции new, то при вызове delete sptr; выполняется деструктор ~String(), а затем освобождается память, занимаемая этим объектом. Предположим, в некой функции объявлена автоматическая переменная типа String: int funct(void) { String str; . . . return 0; } При выходе из функции funct по оператору return переменная str будет уничтожена: выполнится деструктор и затем освободится память, занимаемая этой переменной. В особых случаях деструктор можно вызвать явно: sptr->~String(); Такие вызовы встречаются довольно редко; соответствующие примеры будут рассматриваться позже, при описании переопределения операций new и delete.