Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





 

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

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

на конструктор.

• Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).

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

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

Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.

• Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает конструкторы по умолчанию для полей класса и конструкторы по умолчанию базовых классов. В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а конструктор

по умолчанию этого делать не умеет.

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

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

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

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

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

конструкций:

имя_класса имя_объекта [(список параметров)];

/ / Список параметров не должен быть пустым

имя_класса (список параметров);

// Создается объект без имени (список может быть пустым)

имя^класса имя_объекта = выражение;

// Создается объект без имени и копируется

Примеры:

monstr Super(200. 300). Vas1a(50). Z:

monstr X = monstr(lOOO):

monstr Y = 500;

В первом операторе создаются три объекта. Значения не указанных параметров устанавливаются по умолчанию.

Во втором операторе создается безымянный объект со значением параметра health = 1000 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект X, в которую копируется безымянный объект. В последнем операторе создается безымянный объект со значением параметра health = 500 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект Y, в которую копируется безымянный объект. Такая форма создания объекта возможна в том случае, если для инициализации объекта допускается задать один параметр.

В качестве примера класса с несколькими конструкторами усовершенствуем описанный ранее класс monstr, добавив в него поля, задающие цвет (skin) и имя (name):

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 * nam);

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

case green

case blue

}

health = 100

health = 100

health = 100

ammo *= 10

ammo = 20

ammo = 40

skin = red; name = 0; break

skin =* green; name = 0; break

skin = blue; name = 0; break

184 Часть il. Объектно-ориентированное программирование

// -

monstr::monstr(char * nam){

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

// К длине строки добавляется 1 для хранения нуль-символа

strcpyCname. nam):

health = 100: ammo =10: sk1n = red:

}

//----

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

monstr Green (green):

Первый из приведенных выше конструкторов является конструктором по умолчанию, поскольку его можно вызвать без параметров. Объекты класса monstr теперь можно инициализировать различными способами, требуемый конструктор будет вызван в зависимости от списка значений в скобках. При задании нескольких конструкторов следует соблюдать те же правила, что и при написании перегруженных функций — у компилятора должна быть возможность распознать нужный вариант.

ПРИМЕЧАНИЕ

Перегружать можно не только конструкторы, но и другие методы класса.

Существует еще один способ инициализации полей в конструкторе (кроме использованного в приведенной выше программе присваивания полям значений формальных параметров) — с помощью списка инициализаторов, расположенных после двоеточия между заголовком и телом конструктора:

monstr::monstr(1nt he. int am):

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

Поля перечисляются через запятую. Для каждого поля в скобках указывается инициализирующее значение, которое может быть выражением. Без этого способа не обойтись при инициализации полей-констант, полей-ссылок и полей-объектов, В последнем случае будет вызван конструктор, соответствующий указанным в скобках параметрам.

ПРИМЕЧАНИЕ

Конструктор не может возвратить значение, чтобы сообщить об ошибке во время инициализации. Для этого можно использовать механизм обработки исключительных ситуаций.

 







Date: 2016-07-25; view: 452; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию