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

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;

}

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]