Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.DOC
Скачиваний:
13
Добавлен:
03.05.2019
Размер:
618.5 Кб
Скачать

Конструктор с инициализацией членов класса по умолчанию

Важнейшей разновидностью конструктора является конструктор с инициализацией членов класса по умолчанию, который позволяет при его вызове с аргументами инициализировать данные создаваемого объекта указанными значениями аргументов, а при вызове без аргументов – инициализировать их некоторыми определенными заранее значениями по умолчанию. Для нашего примера конструктор с инициализацией по умолчанию может выглядеть следующим образом:

Men(char n="***",int a=0){name=n;age=a;}

Если такой конструктор вызвать без аргументов, то данные-члены создаваемого объекта будут инициализированы указанными в конструкторе значениями (три звездочки на месте имени и возраст, равный 0). В то же время, вызов конструктора с конкретными значениями аргументов позволит по-прежнему инициализировать объект требуемым образом:

Men m1;//name="***", age=0

Men m2("Собакин",41);//name="Собакин", age=41

Men m3("Львов");//name="Львов", age=0 (по умолчанию)

Men m4(32); //Недопустимый вызов

Как видно из приведенных примеров, при наличии в конструкторе с инициализацией по умолчанию нескольких параметров (у нас – двух), допустимо вызывать конструктор вообще без аргументов, со всеми аргументами, или только с начальными аргументами (если бы в конструкторе было четыре параметра, можно было бы вызвать его с указанием первого, двух первых, трех первых или всех четырех аргументов). Последний же вызов недопустим, так как в нем число 32 стоит на месте первого аргумента, который должен быть указателем на символьную строку. Недопустима так же конструкция

Mem(,32);

Необязательно иметь умолчание для всех переменных, инициализируемых с помощью конструктора. Однако при этом все параметры, не подлежащие инициализации, должны располагаться в начале списка параметров, а инициализируемые параметры – в конце этого списка. Так, можно образовать конструктор

Men(char n,int a=0){name=n;age=a;}//По умолчанию задается

//только значение возраста

однако недопустима конструкция

Men(char n="***",int a){name=n;age=a;}

Компилятор, встретив такое предложение, сообщит об ошибке отсутствия умолчания после параметра a.

Деструкторы

Деструктор, как и конструктор, имеет имя, совпадающее с именем класса, но перед ним ставится знак “~”. Для класса A деструктор должен иметь вид

~A(){тело деструктора}

Деструктор не может иметь ни параметров, ни возвращаемого значения. Он автоматически вызывается при уничтожении объекта класса.

Основное назначение деструктора – выполнение завершающих действий (например, закрытие файлов или уничтожение таймеров). Однако чаще всего деструктор используется для освобождения памяти, динамически выделенной в процессе создания или использования объекта. Если, например, в конструкторе предусмотрено выделение памяти под массив данных с помощью оператора new (что может потребоваться, если размер этого массива заранее неизвестен и передается в конструктор через один из его параметров), то в деструкторе необходимо эту память освободить с помощью оператора delete[]:

class A{

char* array;

public:

A(int size){

array=new char[size];

}

~A(){

delete[] array;

}

};

При таком определении класса A объект a1, созданный предложением

A a1(10);

будет содержать в себе символьный массив длиной 10 байтов, а предложение

A a2(1000)

создаст объект a2 с массивом длиной 1000 байтов.

При создании объекта класса A автоматически вызываемый конструктор выделит память под массив; при уничтожении объекта (оператором delete или при завершении программы) автоматически вызываемый деструктор освободит память массива, после чего будет уничтожена оставшаяся часть объекта.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]