Так же, как и любая функция в языке Си++, конструкторы могут быть перегружены, Это означает, что классе могут быть определены несколько конструкторов. Транслятор так же, как при вызове любой перегружаемой функции, выбирает тот конструктор, который с учетом допускаемых преобразований, имеет наиболее «близкий» по типу и количеству к набору формальных параметров набор фактических параметров.
Пример
Предыдущий пример дополним еще одним конструктором, в котором исходные данные по массиву данных в объекте будут вводиться внутри конструктора, а в параметре конструктора будет задаваться только число вводимых элементов.
#include<iostream.h>
#include <conio.h>
class m
{ int a[12];// закрытые член-данные объекта
int n;
int g;
public:
m(int n1)/* первый конструктор с одним параметром по количеству вводимых элементов*/.
{ n=n1;
cout<<"vvedite "<<n1<<" dannie"<<endl;
for(int i=0;i<n1;i++)
{ cout<<”vvedite element”<<endl;
cin>>a[i];
cout<<”a[i]=”<<a[i]<<endl;
}
}// конец определения 1-го конструктора
m(int n1,int x) /*второй конструктор с двумя параметрами- массиву и количеству элементов*/
{
for(int i=0;i<n1;i++)
{ a[i]=x[i];
cout<<”a[i]=”<<a[i]<<endl;
}
n=n1;
}// конец определения 2-го конструктора
}; //конец определения класса m
int main() // главная функция
{ clrscr();
int f[4]={4,3,2,1};
m obj1=m(4,f); //при инициализации вызывается второй конструктор
m obj2[3]={m(2),m(1),m(1,f)}; /*при инициализации первых 2-х элементов массива вызывается первый конструктор, а для третьего элемента вызывается второй конструктор*/
}
Использование конструкторов для инициализации массивов
Формат записи оператора инициализации массивов имеет следующий вид:
Имя класса массив объектов={список явных вызовов конструкторов для каждого элемента объекта}
Пример
m obj[3]={m(4,f),m(3,f),m(1,y)}; /* описание и инициализация массива из трех объектов*/
В случае, если для приведенного примера не будет указан хотя бы один вызов, то транслятор выдаст сообщение об ошибке.
- Если конструктор содержит только один параметр, то эти параметры могут быть указаны без явного вызова конструктора.
Пример
m obj[3]={1,5,4)}; /*описание массива из трех объектов для случая, когда конструктор содержит только один формальный параметр */
Особенности использования конструкторов без параметров
Так же, как и любая функция, конструктор может не иметь параметров. В этом случае при определении объекта отсутствует список параметров, но сам конструктор обязательно вызывается в точке определения объекта.
Пример
#include<iostream.h>
#include <conio.h>
class m
{
int a[12]; //закрытые члены -данных
int n;
int g;
public:
m()//конструктор без параметров
{ cout<<"constructor without parametr "<<endl;
cout<<" vvedite kolichestvo dannie "<<endl;
cin>>n;
for(int i=0;i<n;i++)
{ cout<<"elementi "<<endl
cin>>a[i];
cout<<a[i]<<endl;
}
}// конец определения конструктора без параметров
m(int n1,int *x)// конструктор с двумя параметрами
{cout<<"constructor with 2 parametrami"<<endl;
for(int i=0;i<n1;i++)
{ a[i]=x[i];
cout<<a[i]<<' '<<x[i]<<endl;
}
n=n1;
} //конец определения конструктора без параметров
};// конец определения класса
int main()// главная функция
{ clrscr();
int f[4]={4,3,2,1};
m obj1=m(4,f); // использование конструкторами с 2-мя параметрами
m obj4; // использование конструктора без параметров
m obj2[3]={m(4,f)};/* вызов конструктора с 2-мя параметрами для 1-го элемента массива объектов, вызов конструктора без параметра для 2-го и 3-его элемента массива*/
} // конец определения главной функции
Внимание
Если в определении объекта указаны скобки () ( как предполагается для вызова конструктора без параметров), то это приводит к ошибке.
Например, вместо m obj4 будет записано m obj4(). Такая запись транслятором воспринимается как объявление функции obj4 без параметров, которая возвращает значение типа m.
Дата: 2019-03-05, просмотров: 232.