Напомним, что для каждого данного, описанного в программе, транслятор выделяет память, к которой в дальнейшем при исполнении производится обращение. Однако, если заранее известны начальные значения данных, то имеется возможность использовать средства инициализации, которые задают эти значения при описании данных, а транслятор генерирует двоичные коды, соответствующие этим данным. Это в определенной степени сокращает время исполнения сгенерированной программы и позволяет составлять более компактные программы.
Например, по оператору вида int a =6 будет выделена память в два байта и записан шестнадцатиричный код 00 06, а по оператору char d=’0’ будет выделена память в один байт и записан шестнадцатиричный код 30.
В случае использования объектов инициализация данных может быть выполнена двумя способами.
Ый способ
Этот метод инициализации аналогичен, описанному выше, и может быть использован, если все члены-данные класса являются открытыми.
Например,
сlass M
{
public:
int h;
char k;
char w [12];
………..
};
int main()
{M obj={56,’t’,”jjjjjjj”}’;…} ;/*объявление и инициализация членов данных объекта*/
В этом случае в соответствии с позициями членам-данным объекта будут присвоены следующие значения : h=56; k=’t’; w=”jjjjjjj”
Примечание
Если в классе определены другие открытые данные, то они не будут инициализированы.
Если в классе, определяющем объект, определены и закрытые данные, то этот способ инициализации не может быть использован.
Способ
В этом случае для инициализации объекта используется специальная член-функция класса, которая называется конструктором. Эта функция соответствует член-функции ввода данных в объект, но она имеет особенности.
Особенности конструктора
- Имя конструктора обязательно совпадает с именем класса; именно по этому признаку транслятор определяет имеется ли конструктор в классе.
- В конструкторе никогда не указывается тип возвращаемого значения.
- Конструктор (если он определен в классе) вызывается всегда автоматически в том месте, где записан оператор определения объекта. Поэтому даже если пользователь не захочет использовать конструктор для инициализации, то при наличии конструктора с параметрами и отсутствия параметров в определении объекта транслятор выдаст сообщение об ошибке.
- Как и любая член-функция конструктор имеет доступ к любым членам класса, поэтому она может быть использована для инициализации член-данных с любым режимом защиты по доступу.
- Для конструктора должен быть определен режим public. Если для него определен режим private, то он может быть использован только другими членами-функциями класса, и он не может быть вызван автоматически.
- Конструктор не может быть вызван по формату вызова, который используется для любой член-функции.
Пример использования конструктора
#include<iostream.h>
class m // заголовок класса
{
int a[12]; // закрытые члены-данные
int n;
int g;
public:
m(int n1,int *x)// описание конструктора с двумя параметрами
{
for(int i=0;i<n1;i++)
{
a[i]=x[i]; ….// передача внешнего массива
cout<<a[i]<<' '<<x[i]<<endl;
}
n=n1;
} ..// конец определения конструктора
};.// конец определения класса
int main() // главная функция
{ int f[4]={4,3,2,1}; // инициализация массива f
m obj1(4,f); /* создание объекта и вызов конструктора по передаче массива f в массив а объекта obj1; фактическими параметрами при вызове конструктора являются данные 4 и f)*/
return 0;
}
Способы определения объектов с использованием конструкторов
Возможно использование двух способов.
1-ый способ –явный вызов конструктора
Пример
Для приведенного выше примера m obj1=m(4,f);// в данном случае явное обращение к функции конструктора в классе m.
2-ой способ – неявная форма - указание фактических параметров в определении объекта.
m obj1(4,f);
m obj2(2,f);
m obj3(1,f);
Дата: 2019-03-05, просмотров: 246.