good tip6 = good (“Шуба”, 100000);
// создается безымянный объект, значения которого используются, напр., в //инициализации вновь созданного объекта tip6
}
Конструктор с аргументами, задаваемыми по умолчанию
Этот конструктор позволяет при его вызове с параметрами инициализировать данные создаваемого объекта указанными значениями параметров.
Но возможен вызов конструктора (или создание объекта) и без параметров, при этом данные инициализируются значениями по умолчанию.
Для класса 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.
Если в конструкторе не было инициализации, то этот конструктор предоставляет возможность создавать неинициализированные объекты даже при наличии в определении класса еще одного конструктора с параметрами.
Конструктор по умолчанию схож при вызове с конструктором с умалчиваемыми значениями и при написании конструкции:
< Имя класса> < имя объекта>;
компилятор обнаруживает двусмысленность и выдает сообщение об ошибке, т. к. не ясно какой конструктор вызывать.
При наличии в классе конструктора с параметрами, задаваемыми по умолчанию, объявлять конструктор по умолчанию нельзя!
Если в определении класса вообще нет конструктора, компилятор автоматически предоставляет конструктор по умолчанию следующего вида:
< Имя класса> () { }
который и создает неинициализированные объекты.