Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Параметризованные конструкторы




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

В простейшем случае этими параметрами могут быть начальные значения для полей объекта.

Пример. Параметризованный конструктор для класса "Точка"

class Point {

private:

double x, y;

public:

Point(double X, double Y);

...

};

Point::Point(double X, double Y) {

x=X;

y=Y;

}

При создании объектов с помощью параметризованных конструкторов используются две формы записи:

1.Явный вызов конструктора

ИмяТипа ИмяОбъекта = ИмяКонструктора(параметры);

Пример. Явный вызов конструктора класса "Точка"

Point A = Point(x,y);

2.Неявный вызов конструктора

ИмяТипа ИмяОбъекта(параметры);

Пример. Неявный вызов конструктора класса "Точка"

PointA(x,y);

По правилам языка C++ в одном классе может быть объявлено несколько параметризованных конструкторов, отличающихся наборами параметров.

Подобная возможность носит название перегрузка конструкторов.

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

Пример. Параметризованные конструкторы для класса "Вектор"

class Vector {

private:

double x, y;

public:

// создание вектора по координатам

Vector(doubleX,doubleY);

// создание вектора по точкам

Vector(Point A, Point B);

...

};

//созданиевекторапокоординатам

Vector::Vector(double X, double Y) {

x=X;

y=Y;

}

// создание вектора по точкам

Vector::Vector(Point A, Point B) {

x = B.GetX() - A.GetX();

y = B.GetY() - A.GetY();

}

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

1. Сначала вызываются конструкторы базовых классов в порядке их перечисления в списке наследования (еще один список, в котором после символа : перечисляются базовые классы, разделенные запятыми).

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

3. После того как будут сконструированы все базовые классы и переменные, выполняется тело вашего конструктора.

Описанный порядок применяется рекурсивно, то есть первым конструируется первый базовый класс первого базового класса... и т. д. Он не зависит от порядка, указанного в списке инициализации членов.

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

48. Списки инициализации членов и анонимные экземпляры в языке C++

49. Понятия базового и производного классов

50. Спецификатор доступа при наследовании классов в языке C++

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 273.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...