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

Конструкторы

Основные свойства:

  • Не возвращает значение. Нельзя получить указатель на конструктор.

  • Класс может иметь несколько конструкторов с разными параметрами.

  • Конструктор, вызываемый без параметров, наз. конструктором по умолчанию.

  • Параметры конструктора могут иметь любой тип, кроме этого же класса. Только один из конструкторов может содержать значения параметров по умолчанию.

  • Если не указан ни один конструктор, он создается автоматически.

  • Конструкторы не наследуются.

  • Конструкторы нельзя описывать с модификаторами const, virtual, static.

  • Конструкторы глобальных объектов вызываются до вызова main. Локальные объекты создаются, когда становится активной область их действия.

  • Конструктор вызывается, если в программе встретилась какая-либо из конструкций:

Описание объектов:

  1. имя_класса имя_объекта [(список параметров)] // список параметров не должен быть пустым

  2. имя_класса (список параметров) // список параметров может быть пустым, создается объект без имени

  3. имя_класса имя_объекта = выражение // создается объект без имени и копируется

#include <iostream.h>

#include <stdlib.h>

#include <string.h>

enum color{red, green, blue};

class monstr{

int health,ammo;

color skin;

char *name;

public:

monstr(int he=100, int am=10);

monstr(color sk);

monstr(char *nm);

void draw( int x, int y, int scale, int position);

int get_health()

{return health;}

int get_ammo()

{return ammo;}

};

monstr::monstr(int he, int am) /* конструктор по умолчанию, т.к. его можно вызывать бех параметров */

{health = he;

ammo = am;

skin = red;

name = 0;

}

monstr::monstr(color sk)

{switch (sk)

{ case red: ammo = 10; skin = red; break;

case green: ammo = 20; skin = green; break;

case blue: ammo = 40; skin = blue;

}

health = 100; name = 0;

}

monstr::monstr(char *nm)

{health = 100;

ammo = 10;

skin= red;

name = new char [strlen(nm)+1];

strcpy (name , nm);

}

...

void monstr::draw(int x, int y, int scale, int position)

{ cout <<x<< y<< scale<< position;}

void main()

{

monstr Vasia, Super(200,300), stado[100];

cout << '\n'<< Best.get_health();

monstr Green(green);

monstr *m = new monstr("Ork");

}

Можно инициализировать поля в конструкторе с помощью списка инициализаторов, расположенных через запятую между заголовком и телом конструктора:

monstr::monstr(int he, int am): health (he),

ammo(am), skin (red), name (0){}

Это единственно возможный способ для инициализации полей-констант, полей-ссылок, полей-объектов.

Конструктор копирования

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

<имя класса>::<имя класса>(const &<имя класса>) {/* тело конструктора*/}

Конструктор вызывается, когда объект копируется копированием существующего:

  • при описании нового объекта с инициализацией другим объектом;

  • при передаче объекта в функцию по значению;

  • при возврате объекта из функции.

Если не указано конструктора копирования, он создается автоматически. При этом осуществляется копирование полей, и если класс содержит указатели или ссылки, копирование будет «неправильным» (одна область памяти).

monstr::monstr(const monstr &M)

{health = M.health;

ammo = M.ammo;

skin= M.skin;

if (M.name)

{ name = new char [strlen(M.name)+1];

strcpy (name , M.name);

}

else name = 0;

void main(

{…

monstr Vasia(blue);

monstr Super = Vasia; //конструктор копирования

monstr *m = new monstr("Ork");

monstr Green = *m; //конструктор копирования

}

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