Similar presentations:
Типы конструкторов
1. Типы конструкторов
• Конструктор без параметров – конструктор поумолчанию (default constructor)
•// компилятор автоматически встраивает в
программу конструктор без параметров, который и
создает экземпляры класса. Такой конструктор
можно определять явно с целью инициализации
полей конкретными значениями
• Конструктор c параметрами – конструктор
инициализации (initialized constructor)
2.
Конструктор без параметров – конструктор поумолчанию (default constructor)
Если не объявить явно – компилятор автоматически
встраивает
в
программу.
Какими
значениями
инициализируются поля неизвестно.
Если важно, какими значениями инициализируются поля –
объявить явно:
class MyClass {
int a,b;
public:
MyClass(): a(0), b(1)
//инициализация константными
//
значениями
{}
…
3. Конструкторы с параметрами
• Конструктор c параметрами – конструкторинициализации (initialized constructor)
class MyClass {
int a,b;
public:
MyClass(int ax, int bx): a(ax), b(bx)
//инициализация
//полей значениями, передаваемыми конструктору в
// качестве аргументов
{}
4.
• Перегруженные конструкторыclass MyClass {
int a,b;
public:
MyClass(): a(0), b(1)
{}
MyClass(int ax, int bx): a(ax), b(bx)
{}
};
5. Пример №9 (дополнение примера 8)
class Queue{protected:
int id;
int q[100];
int bq, endq;
public:
public:
Queue (void);
(void); //// конструктор
конструктор
Queue
~Queue
Queue(int
(void);
// деструктор
i); //к-р
с параметром
qput(int
m); // деструктор
~void
Queue
(void);
int qget(void);
void
qput(int m);
}; int qget(void);
};
Queue::Queue (void)
{ bq=endq=0; id=0;
cout<<“Очередь инициализирована\n”;
}
Queue::~Queue (void)
{ cout<<“Очередь “<<id<<“разрушена\n”; }
Queue::Queue (int i)
{
bq=endq=0; id=i;
cout<<“Конструктор”<<id<<“\n”;
}
int Queue::qget(void)
{ if (endq==bq) {
cout<<“Очередь пустая\n”;
return 0;}
return q[bq++];
}
void Queue::qput(int m)
{ if (endq==100) {
cout<<“Очередь полна\n”;
return;}
q[endq++]=m;
}
6. Пример №9 (продолжение)
Передача значения параметра:Результат работы:
Queue a = Queue(101)
или
Queue a(101);
int main()
{
Queue a(101), b(102), c;
Конструктор 101
Конструктор 102
Конструктор 0
- ???
10 25 300
a.qput(10);
b.qput(25);
c.qput(300);
cout<<a.qget()<<“\n”;
cout<<b.qget()<<“\n”;
cout<<c.qget()<<“\n”;
return 0;
}
Очередь 0 разрушена
Очередь 102 разрушена
Очередь 101 разрушена
7. Пример №9 (продолжение)
Передача значения параметра:Queue a = Queue(101)
или
Queue a(101);
class Date
{
Date(int,int,int);
//-----};
Date today = Date(24,10,2017);
Date today (24,10,2017);
class object
{
private:
int t;
public:
object (int tt)
{
t=tt;
}
}
…
object obj = object(10)
8. Пример №9 (продолжение)
Передача значения параметра:class object
{
Queue a = Queue(101)
private:
или
int t;
Queue a(101);
public:
object (int tt)
{
t=tt;
С точки же зрения синтаксиса и
}
семантики языка конструктор ничего }
не возвращает
…
object obj = object(10)
9. Пример №9 (продолжение)
Передача значения параметра:Queue a = Queue(101)
или
Queue a(101);
http://msdn.microsoft.com/enus/library/s16xw1a8.aspx
A constructor is a kind of member function
that initializes an instance of its class. A
constructor has the same name as the class
and no return value. A constructor can have
any number of parameters and a class may
have any number of overloaded constructors.
Constructors may have any accessibility, public,
protected or private. If you don't define any
constructors, the compiler will generate a
default constructor that takes no parameters;
you can override this behavior by declaring a
default constructor as deleted.
Конструктор - это своего рода
функция-член,
которая
инициализирует экземпляр своего
класса. Конструктор имеет то же имя,
что и класс, и нет возвращаемого
значения. Конструктор может иметь
любое количество параметров, и класс
может иметь любое количество
перегруженных
конструкторов.
Конструкторы могут иметь любую
доступность, публичную, защищенную
или закрытую. Если вы не определяете
каких-либо
конструкторов,
компилятор
будет
генерировать
конструктор по умолчанию, который
не принимает никаких параметров; вы
можете
переопределить
это
поведение, объявив конструктор по
умолчанию как удаленный.
10. Пример №9 (продолжение)
class Date{
Date(int,int,int);
//-----};
Date today = Date(24,10,2017);
Date today (24,10,2017);
Оптимизирующий
компилятор
вместо создания 2-х объектов и
копирования содержания одного в
содержание другого создаст один
объект сразу же с нужными
параметрами.
Создается временный анонимный
экземпляр (anonymous instance)
объекта, который прекращает свое
существование (точнее, становится
"невалидным"; когда именно его
разрушить - решает компилятор)
после инциализации объекта today.
11. Пример №9 (продолжение)
class object{
private:
int t;
public:
object (int tt)
{
t=tt;
}
void Show () {…};
}
int main()
{
object obj = object(10)
object (25).Show();
}
Используется
анонимный
экземпляр (anonymous instance)
объекта, который прекращает свое
существование (точнее, становится
"невалидным"; когда именно его
разрушить - решает компилятор)
немедленно после возврата из
метода Show().
12. Конструкторы с параметрами при наследовании
Схема наследования(простое наследование):
class X (поле x)
class Y (поле у)
class Z (поле z для хранения
суммы x и y)
13. Конструкторы с параметрами при наследовании. Пример №10
class X{protected:
int x;
public:
X(int i); //к-р с параметром
~ X (void); // деструктор
…
};
class Y: public X{
protected:
int y;
public:
Y(int i, int j); //к-р с параметрами
~ Y (void); // деструктор
…
};
class Z: public Y{
protected:
int z;
public:
Z(int i, int j); //к-р с параметрами
~ Z (void); // деструктор
void make_z(void) {z=x*y;};
void Show(void) { cout<<z<<“ \n ”; }
};
X::X(int i)
{ x=i; cout<<“Конструктор X\n”; }
Y::Y(int i, int j):X(i)
{ y=j; cout<<“Конструктор Y\n”; }
Z::Z(int i, int j):Y(i,j)
{ cout<<“Конструктор Z\n”; }
Конструктор класса Y передаёт значение
первого параметра конструктору класса X.
Конструктор класса Z передаёт значения
параметров конструктору класса Y.
14. Конструкторы с параметрами при наследовании. Пример №10
class X{protected:
int x;
public:
X(int i); //к-р с параметром
~ X (void); // деструктор
void put_x(int i) {x=i;};
int get_x(void) {return x;};
void Show(void) { cout<<x<<“ \n ”; }
};
class Y: public X{
protected:
int y;
public:
Y(int i, int j); //к-р с параметрами
~ Y (void); // деструктор
void put_y(int i) {y=i;};
int get_y(void) {return y;};]
void Show(void) { cout<<y<<“ \n ”; }
};
class Z: public Y{
protected:
int z;
public:
Z(int i, int j); //к-р с параметрами
~ Z (void); // деструктор
void make_z(void) {z=x*y;};
void Show(void) { cout<<z<<“ \n ”; }
};
X::X(int i)
{ x=i; cout<<“Конструктор X\n”; }
Y::Y(int i, int j):X(i)
{ y=j; cout<<“Конструктор Y\n”; }
Z::Z(int i, int j):Y(i,j)
{ cout<<“Конструктор Z\n”; }
Конструктор класса Y передаёт значение
первого параметра конструктору класса X.
Конструктор класса Z передаёт значения
параметров конструктору класса Y.
15. Пример №10 (продолжение)
//Деструкторы:X::~X(void)
{ cout<<“Деструктор X\n”; }
Y::~Y(void)
{ cout<<“Деструктор Y\n”; }
Z::~Z(void)
{ cout<<“Деструктор Z\n”; }
int main() {
//Создание и инициализация объета :
Z Zobj(3,5);
Zobj.make_z();
Zobj.Show();
Zobj.X::Show();
Zobj.Y::Show();
Zobj.put_x(7);
Zobj.put_y(9);
Zobj.make_z();
Zobj.Show();
Zobj.X::Show();
Zobj.Y::Show();
return 0;
}
Результат работы:
Конструктор X
Конструктор Y
Конструктор Z
15
3
5
63
7
9
Деструктор Z
__________________________________________________________________________________________
Деструктор Y
Деструктор X
16. Пример
class A{int main () {
// работает конструктор с параметром
protected:
A aobj(25);
(инициализации) A(int i)
int x;
public:
A a1obj; // работает конструктор без параметров
A(void) {cout<< "Constr-r A
(по умолчанию) A()
default \n" };
B bobj(10); // работает конструктор с параметром
A(int i) {cout<< "Constr-r A
(инициализации) B(int j)
initialized \n"; };
//B b1obj;
…
error C2512: 'B' : no appropriate default constructor available
};
36 no matching function for call to `B::B()'
class B{
B b2obj(); // запускается без ошибки, объект не создался
protected:
int y;
bobj.Show();
public:
//b2obj.Show();
B(int j) {cout<< "Constr-r B //b2obj.y=7;
\n"; };
void Show(void) {cout<< … error C2228: left of '.y' must have class/struct/union
"function Show \n"; };
}
};
17.
18. Пример
class A{protected:
int x;
public:
A(void) {cout<< "Constr-r A
default \n" };
A(int i) {cout<< "Constr-r A
initialized \n"; };
…
};
class B{
protected:
int y;
public:
// B(int j) {cout<< "Constr-r B
\n"; };
void Show(void) {cout<<
"function Show \n"; };
};
int main () {
A aobj(25); // работает конструктор с параметром
(инициализации) A(int i)
A a1obj; // работает конструктор без параметров
(по умолчанию) A()
// B bobj(10); //
no matching function for call to `B::B(int)'
B b1obj; - ???
b1obj.Show();