- •Void Print();
- •Void print()
- •Void main()
- •Void print()
- •Void main()
- •Void main()
- •Void print()
- •Void main()
- •Void print()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void print();
- •Void Drob::print()
- •Void main()
- •Void main()
- •Void print();
- •Void Drob::print()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main ()
- •Void main ()
- •Void main ()
Void main()
{
Test a('A');
Test b('B');
F();
Test c('C');
}
#include<iostream>
#include<stdio.h>
using namespace std;
class student
{
private:
char *name;
char *middlename;
char *surname;
int age;
public:
student()
{
char*sname=new char[20];
char*smiddlename=new char[20];
char*ssurname=new char[20];
name=sname;
middlename=smiddlename;
surname=ssurname;
}
Void print()
{
cout<<"Imia studenta - "<<
}
};
Void main()
{
student s;
}
#include<iostream>
#include<stdio.h>
using namespace std;
class student
{
private:
char *name;
char *middlename;
char *surname;
int age;
public:
student()
{
name=new char[20];
middlename=new char[20];
surname=new char[20];
}
~student()
{
cout<<"Destructor!!!"<<endl;
delete[]name;
delete[]middlename;
delete[]surname;
}
Void print()
{
cout<<"Dannie o studente - "<<name<<" "<<middlename<<" "<<surname<<" "<<age<<" let"<<endl;
}
void input()
{
cout<<"Imia studenta - ";
cin>>name;
cout<<"Otchestvo studenta - ";
cin>>middlename;
cout<<"Familia studenta - ";
cin>>surname;
cout<<"Vozrast studenta - ";
cin>>age;
}
};
class gruppa
{
private:
student*group;
int size;
public:
gruppa(int ASize)
{
size=ASize;
group=new student[size];
}
void inputGroup()
{
for(int i=0;i<size;i++)
group[i].input();
}
void printGroup()
{
for(int i=0;i<size;i++)
group[i].print();
}
};
Void main()
{
int size;
cout<<"Vvedite kolichestvo studentov = ";
cin>>size;
gruppa g(size);
g.inputGroup();
system("CLS");
g.printGroup();
}
ПЕРЕГРУЖЕННЫЕ КОНСТРУКТОРЫ
Конструкторы , как и функции можно перегружать , то есть можно создать несколько конструкторов с разным списком параметров .
#include<iostream>
#include<stdio.h>
using namespace std;
class Drob
{
private:
int ch;
int zn;
public:
Drob()
{
ch=0;
zn=1;
}
Drob(int aCh)
{
aCh=ch;
zn=1;
}
Drob(int aCh,int aZn)
{
aCh=ch;
aZn=zn;
}
};
Void main()
{
Drob a;
Drob b(4);
Drob c(2,5);
}
Также при создании конструктора можно создавать аргументы по умолчанию .
class Drob
{
private:
int ch;
int zn;
public:
Drob(int aCh=0, int aZn=1)
{
aCh=ch;
aZn=zn;
}
В случае раздельного объявления и определения методов класса , нельзя в определении повторять значение по умолчанию.
Drob::Drob(int aCh/*=0,int aZn/*=1)
Поскольку деструктор вызывается не явно , то он может иметь только одну форму – без параметров , соответственно перегружать деструктор нельзя .
Неявное создание конструкторов \ деструкторов!
В действительности конструктор не просто инициализирует объект , а создает этот объект.
А деструктор соответственно уничтожает его .
Это означает что не может существовать класса в котором не было бы конструктора или деструктора .
Если программист не определил ни одного конструктора и деструктора в классе – то компилятор не явно создает один конструктор и деструктор .
Естественно такой конструктор или деструктор является по умолчанию . Это происходит только в том случае , если программист явно не создал ни одного конструктора иди деструктора .
Если в классе есть один конструктор и этот конструктор имеет хотя бы один параметр , то компилятор создавать конструктор по умолчанию не будет .
Class MyClass
{
MyClass(int n)
{
….
}
….
};
MyClass a(10);
MyClass b;-ошибка на этапе компиляции , так как нет конструктора по умолчанию .
ЯВНЫЙ ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ
В языке С реализована возможность явного вызова конструктора или деструктора .
Class MyClass
{
MyClass();
~MyClass();
….
};
MyClass obj;
Obj.MyClass::MyClass();
Obj.MyClass::~MyClass();
Явный вызов конструктора особого смысла не имеет. Но явный вызов конструктора применяется в некоторых специфических ситуациях .
ИНИЦИАЛИЗАТОРЫ
Инициализаторы это специальная конструкция , позволяющая инициализировать поля класса до тела конструкторов .
Class MyClass
{
Private:
Int a;
Char ch;
Public:
MyClass():a(0),ch(‘A’){}
MyClass(int aA, char aCh):a(aA),ch(aCh) {}
};
Использование инициализаторов имеет смысл в том случае , когда поля класса являются экземплярами других классов . Ведь для их создания будут вызываться их конструкторы.
Обычно неявно вызываются конструкторы по умолчанию.
А что если такого конструктора нет? В этом случае и используется инициализатор .
Class A
{
Int a;
Public:
A(int i){a=i}
};
Class B
{
Int b;
Public:
B(int i){b=i}
…
}
Class MyClass
{
A obj A;
B obj B;
Public:
MyClass():obj A(4), objB(5)
{
….
}
}
Порядок вызова инициализаторов определяется не порядком в котором они перечислены в конструкторе , а порядком объявления самих полей .
Class A
{
Int a;
Public:
A(int i){a=i}
};
Class B
{
Int b;
Public:
B(int i){b=i}
…
}
Class MyClass
{
A obj A;
B obj B;
Public:
MyClass(): objB(5), obj A(4)
{
….
}
}
MyClass obj;
Constructor A
Constructor B
Constructor MyClass
Инициализаторы также используются для инициализации константы .
КОНСТРУКТОР КОПИРОВАНИЯ!
Конструктор копирования – это конструктор , который в качестве параметров принимает объект класса для которого он вызывается . Конструктор копирования вызывается в случае :
MyClass a;
MyClass b=a;
При присваивании одного объекта другому обычно происходит побитовое копирование .
Если в классе используется динамическая память , то побитовое копирование может привести к серьезным проблемам.
Пример 1
Инициализация одного объекта другим!
#include<iostream>
#include<stdio.h>
using namespace std;
class MyClass
{
private:
int *p;
public:
MyClass()
{
cout<<"Constructor"<<endl;
p=new int[3];
}
~MyClass()
{
delete[]p;
}
};