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

Конструктор с аргументами, задаваемыми по умолчанию

Этот конструктор позволяет при его вызове с параметрами инициализировать данные создаваемого объекта указанными значениями параметров.

Но возможен вызов конструктора (или создание объекта) и без параметров, при этом данные инициализируются значениями по умолчанию.

Для класса Men конструктор с умалчиваемыми значениями параметров:

Men (char*n = “ ”, int a =0)

// значения по умолчанию имя – пробел, возраст -0

{name=n; age = a; }

/* Такой конструктор можно вызвать без параметров. Если такой конструктор вызвать без параметров, то создаваемый объект будет инициироваться значениями по умолчанию.

Вызов того же конструктора с параметрами будет инициировать данные создаваемого объекта значениями параметров */

Void main ()

{ Men m1; // name = “ “ , age =0

Men m2 ( “ Иванов”, 45) // name=”Иванов”,age= 45

Men m3 (“Петров”) //name= “Петров”age=0

Men m4 (18) // ошибка!

Нельзя задавать параметр, перескакивая через умалчиваемое значение (это значение компилятором будет трактоваться как значение параметра n, и естественно будет сообщение об ошибке, т.к. это не строка).

Напр., если четыре параметра с умалчиваемыми значениями, можно вызывать конструктор:

  1. без параметров;

  2. с указанием только первого параметра ( три параметра – значения по умолчанию);

  3. с указанием двух первых параметров ( два последних – по умолчанию)

  4. с указанием трех первых ( последний – по умолчанию)

  5. с указанием четырех параметров

Еще пример:

struct mag

{ int a,b, c ;

mag ( int aa=1, int bb=2 , int cc=3) // конструктор

//с умалчиваемыми значениями параметров

{ a= aa; b=bb; c= cc; };

Void shownumber ( void)

{cout << a <<b <<c ; } ;

};

mag one; // объект инициализируется значениями 1, 2 ,3

mag one1 (10); // объект инициализируется значениями 10, 2 ,3

mag one2 (10,20); // объект инициализируется значениями 10, 20 ,3

mag one3 (10,20,30) // объект инициализируется значениями 10, 20 ,30

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

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

Men ( char*n = “ “ , int a) { name = n; age = a; } // ошибка!

Конструктор по умолчанию

Это разновидность конструктора без параметров (присутствует в классе в единственном экземпляре).

Присутствует, когда надо единообразно инициализировать данные, или инициализирующие действия вообще не связаны с данными.

Этот конструктор не имеет параметров.

class A {

int x , y ;

public:

A ( ) ;

...

};

A :: A ( ) // невстроенный конструктор по умолчанию

{ x =0 ; y = 0; //инициализация данных, может отсутствовать

... //другие инициализирующие действия

}

/* мог бы быть просто такой:

A :: A ( ) { } */

При наличии конструктора по умолчанию , предложение

A one ;

создает объект со значениями данных x=0 и y=0.

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

Конструктор по умолчанию схож при вызове с конструктором с умалчиваемыми значениями и при написании конструкции:

<Имя класса> < имя объекта> ;

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

При наличии в классе конструктора с параметрами, задаваемыми по умолчанию, объявлять конструктор по умолчанию нельзя!

Если в определении класса вообще нет конструктора, компилятор автоматически предоставляет конструктор по умолчанию следующего вида:

<Имя класса> ( ) { }

который и создает неинициализированные объекты.