Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Конструкторы и деструкторы

В языке С++ нельзя инициализировать объект тем же способом, что и встроенные типы, например, int или float, поэтомубыла создана специальная функция класса, называемая конструктором.

Конструктор – это специальная функция класса, которая вызывается автоматически при создании объекта и предназначена для его инициализации. Конструктор должен иметь то же имя, что и класс (чтобы компилятор смог её определить).

Конструкторы глобальных объектов вызываются до вызова функции main(). Для локальных объектов конструктор вызывается всякий раз при создании объекта. Если класс не содержит ни одного конструктора, он создаётся компилятором как функция без параметров и с пустым телом.

Основные правила использования конструктора:

· конструктор не может возвращать значение, даже типа void;

· конструктор должен быть открытым членом класса;

· класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации;

· параметры конструктора могут иметь любой тип (кроме типа этого же класса), могут бытьзаданы как аргументы по умолчанию, но их может содержать только один из конструкторов.

Деструктор – это функция класса, которая вызывается автоматически при удалении объекта.

Основные правила использования деструктора:

· имя деструктора начинается c символа тильды (~), непосредственно за которым следует имя класса;

· деструктор не может иметь параметров, не может возвращать значение;

· нельзя перегружать деструктор;

Класс должен иметь только один деструктор или ни одного, в этом случае он создаётся компилятором как пустая функция (без параметров и с пустым телом).

Деструктор класса автоматически вызывается при удалении объекта. Локальные объекты удаляются, если они выходят из области видимости, например, при выходе из функции. Глобальные объекты удаляются при завершении программы. Использовать деструктор имеет смысл при работе с динамической памятью.

// Пример 12.3. Использование конструктора и деструктора.

#include <iostream>

using namespace std;

class Samp{ // определение класса Samp

int a;

public:

Samp(){a = 0;} // конструктор

void show(){cout<<"a = "<<a<<endl;} // функция show()

~Samp(){cout<<"Destructor"<<endl;} // деструктор

};

int main(){

Samp ob; // создание объекта ob, вызов конструктора

ob.show(); // a = 0

system("pause");

}

Конструкторы с параметрами

Конструкторы позволяют задавать значения для инициализации объекта не в теле функции-конструктора, а передавать их как аргументы.

// Пример 12.4. Определение класса для работы с целыми числами.

//Нахождение суммы двух целых чисел.

// Использование конструктора с параметрами.

#include <iostream>

using namespace std;

class Chisla { // определение класса Chisla

int a, b; // число a, b

public:

Chisla(int x, int y){ a = x; b = y;} // конструктор с параметрами

int sum(){return a + b;} // функция суммы чисел

void show(); // функция вывода чисел

};

void Chisla::show(){

cout<<"a = "<<a<<" b = "<<b<<endl;

}

int main() { // функция main()

int n, m; cout<<"vvedi 2 chisla: "; cin>>n>>m;

Chisla ob(n, m); // объект ob класса Chisla

ob.show(); int s = ob.sum(); // вызов функций show() и sum()

cout<<"summa = "<<s <<endl;

system("pause");

}

Конструкторы по умолчанию

Если в классе не определено ни одного конструктора, компилятор сгенерирует для класса конструктор по умолчанию вида:

Samp::Samp(){} // неявный конструктор по умолчанию

Данный конструктор инициализирует все данные объекта значениями по умолчанию. Если же в классе определён конструктор, следует в случае необходимости, задать конструктор по умолчанию явно:

Samp::Samp(){ a = n ;} // явный вид конструктора по умолчанию

Этот конструктор не имеет параметров, но им можно воспользоваться для инициализации данных объекта определёнными значениями.

Конструктор с параметрами также может быть конструктором по умолчанию, но для этого все параметры конструктора должны быть заданы как аргументы по умолчанию, причём такие параметры можно задавать только в прототипе функции-конструктора внутри определения класса, и в программе не должно быть другого конструктора по умолчанию:

Samp::Samp( int n = 0, int b = 0){a = n; b = m;}

Такой конструктор может вызываться и с параметрами и без параметров.

Конструктор по умолчанию – это конструктор, который не имеет параметров или у которого все параметры заданы как аргументы по умолчанию. Класс может иметь только один конструктор по умолчанию. Если класс не имеет ни одного конструктора, то компилятор, если надо, сгенерирует неявный конструктор по умолчанию сам.

// Пример 12.5. Определение класса для вычисления объёма куба.

// Использование конструктора с аргументами по умолчанию.

#include <iostream>

using namespace std;

class Cub{ // определение класса Cub

int len, wid, hei;

public:

Cub(int le = 1, int wi = 1, int he = 1); // конструктор по умолчанию

void show(){cout<<endl<<len<< ' ' <<wid<< ' ' <<hei;}

int volum(){return len * wid * hei;}

};

Cub::Cub(int le, int wi, int he){

len = le; wid = wi; hei = he;

}

int main() {

Cub ob1, ob2(3), ob3(5, 4, 3);

ob1.show(); cout<<" v = "<<ob1.volum(); // 1 1 1 v = 1

ob2.show(); cout<<" v = "<<ob2.volum(); // 3 1 1 v = 3

ob3.show(); cout<<" v = "<<ob3.volum()<<endl; // 5 4 3 v = 60

system("pause");

}

Перегрузка конструкторов

Конструкторы в С++ можно перегружать, чтобы обеспечить множество начальных значений для инициализации объектов класса.

// Пример 12.6. Перегрузка конструктора для случая инициализации объекта

// явно указанными значениями и значениями, заданными по умолчанию.

#include<iostream>

using namespace std;

class Samp { // определение класса Samp

int x, y;

public:

Samp(){x = rand() % 20; y = rand() % 20;}

Samp(int m, int n){x = m; y = n;}

void show();

};

void Samp::show(){

cout<<x<< ' ' <<y<<endl;

}

int main (){

int a, b;

cout<<"vvedi a, b:"; cin>>a>>b;

srand(a+b);

Samp ob1(a, b); // объект с явной инициализацией

Samp ob2; // объект без явной инициализации

ob1.show();

ob2.show();

system("pause");

}

<== предыдущая лекция | следующая лекция ==>
Синдром преждевременного истощения яичников: чаще диагностируется во взрослом возрасте , диагностика в период пубертата является казуистикой | Указатель на объект
Поделиться с друзьями:


Дата добавления: 2015-06-25; Просмотров: 973; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.