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.
Если в конструкторе не было инициализации, то этот конструктор предоставляет возможность создавать неинициализированные объекты даже при наличии в определении класса еще одного конструктора с параметрами.
Конструктор по умолчанию схож при вызове с конструктором с умалчиваемыми значениями и при написании конструкции:
< Имя класса> < имя объекта>;
компилятор обнаруживает двусмысленность и выдает сообщение об ошибке, т. к. не ясно какой конструктор вызывать.
При наличии в классе конструктора с параметрами, задаваемыми по умолчанию, объявлять конструктор по умолчанию нельзя!
Если в определении класса вообще нет конструктора, компилятор автоматически предоставляет конструктор по умолчанию следующего вида:
< Имя класса> () { }
который и создает неинициализированные объекты.
Конструктор копирования
Назначение:
1) создать объект полностью совпадающий с уже созданным;
2) передача в некоторую функцию экземпляра класса, при этом в стеке создается локальная копия объекта, с которым и работает функция;
3) функция передает в некоторую переменную объект класса, фактически этот объект сначала создается в функции как локальная переменная, и лишь затем копируется в переменную, стоящую в левой части выражения.
Операции копирования объектов выполняет конструктор копирования.
В большинстве случаев компилятор предоставляет нам конструктор копирования по умолчанию, обеспечивая правильное копирование.
Копирование по умолчанию:
|
|
class T {
int x, y;
public:
T (int tx, int ty) { x = tx; y = ty; }
int GetX () { return x; }
int GetY () { return y; }
friend T sum (T, T);
};
void Print (T obj)
{ cout<<’\n’<<”x=”<<obj.GetX() <<” y=”<<obj.GetY(); }