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