Доступ к приватным членам класса
Для того, чтобы иметь доступ к приватным данным, нужно написать функцию члена, которая будет возвращать значение члена данных.
Class Box
{
Private: double L,H,W;
Public:
Box(double fr=1.0, double hv=1.0, double bv=1.0
{ cout<<”Constructor called\n”;
L=lv;H=hv;W=bv;} double Volume() {return L*H*W;}
Double Get_lenght();
Inline double Box::Get_length(){return L;}
};
Int main()
{
Box matchbox(1.5,2.5,2.0);
Box box1(matchbox);
Double V=box1.volume();
Cout<<”the volume of box1=”<<V/box1.Get_lenght()<<endl;
Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;
Return 0;
}
Дружественные функции
Бывают случаи, когда по некоторым причинам необходимо, чтобы некоторые функции, не являющиеся членом класса, имели доступ к приватным членам функции. Такие функции называются дружественными функциями класса и определяются с помощью ключевого слова friend. В самом классе можно либо указать прототип дружественной функции, либо целиком ее определение. Так как дружественные функции не являются членами класса, то атрибуты доступа не относятся к ней. Это класс функций с некоторыми привилегиями (есть доступ ко всем членам класса), которыми не могут пользоваться обычные глобальные.
Примечание: в соответствии с используемым нами стилем программирования, дружественная функция должна быть описана в конце класса.
Пример:
Создадим дружественную функцию, которая будет возвращать сумму поверхностей ящика.
Class Box
{
Private: double L,H,W;
Public:
Box(double fr=1.0, double hv=1.0, double bv=1.0
{ cout<<”Constructor called\n”;
L=lv;H=hv;W=bv;} double Volume() {return L*H*W;}
Double Get_lenght();
Inline double Box::Get_length(){return L;}
Friend double BoxSurface(Box aBox);
};
Double BoxSurface(Box aBox);
Return 2*(aBox.L* aBox.H+ aBox.L* aBox.W+ aBox.H* aBox.W)
Int main()
{
Box matchbox(1.5,2.5,2.0);
Box box1(matchbox);
Double V=box1.volume();
Cout<<”the volume of box1=”<<V/box1.Get_lenght()<<endl;
Cout<<”the volume of matchbox=”<< matchbox.volume()<<endl;
Return 0;
}
Интересным применением указателя this является недопущения присваивания самому себе. В дальнейшем мы увидим, что присваивание объекта самому себе может вызвать серьезные ошибки, если объекты содержат указатели на выделенную динамическую память.
Статические члены класса
Double sum (double a, double b)
{ static int count=0;
Count++;
Cout<<”this function has been called ”<<count<<”times”<<endl;
return a+b;}
int main()
{
…
Sum(5.0,5.0);
…
Sum(5.0,5.0);
…
Return 0;
}
Статические члены класса
Статические данные-члены
Статические функции-члены
Статические данные-члены дают такой эффект, что они создаются в единственном экземпляре и разделяются всем объектами класса.
Обычные данные-члены создаются в виде копии для каждого объекта. Но для всего класса имеется только по одному экземпляру каждого статического члена независимо от того, сколько объектов этого класса было определено.
Static int count; - статическая переменная, по умолчанию имеет значение 0, существует во время выполнения всей программы. Локальные же имеют по умолчанию «мусорное» значение, существуют только в своем блоке программы.
Одним из практических применений статических переменных является подсчет количества вызовов функции.
Double sum (double a, double b)
{
static int count;
Count++;
Cout<<”sum was been called ”<<count<<” times”<<endl;
Return a+b;
}
Int main()
{
sum (5,3);
…
Sum(10,3);
…
Return 0;
}
Class Box
{
Public:
Static int count;
…
Private:
Double L,H,W;};
Одним из практичских применений статических переменных является подсчет существующих объектов класса. Для этого его нужно поместить в общедоступный раздел класса.
Как инициализировать данный объект класса?
Нельзя инициализировать в самом классе, т.к. класс общая модель для создания любого объекта класса. Мы не можем его инициализировать в конструкторе т.к. мы желаем его значения увеличивать при каждом вызове конструктора для создания объектов.
Мы не можем инициализировать его в другом функции-члене, т.к. она будет ассоциироваться с объектом, а инициализация этого статического члена нужна для любого объекта. Значит статический данный-член нужно инициализировать вне класса с помощь оператора int Box::count=0;
Class Box
{
Public:
Static int count;
Box( double pv, double hv=1.0, double bv=1.0)
{ cout <<”constructor called”;
L=H=W=1.0;
Count++;}
Couble Volume() {return L*H*W;}
Private:
Double L,H,W;
};
Int Box::count=0;
Int main()
{
Box boxes[5];
Box cigar (2.0, 5.0, 1.0);
Cout<<”\n\n Number of objects (through class)=”<<box.count<<endl;
Cout<<”\n\n Number of objects (through object)=”<<boxes[2].count<<endl;
Return 0;
}йомахарт ймасоул nhgjhygjuloilhgbg
Статические члены класса существуют, даже если никаких объектов не было создано и это очевидно из того, что они инициализируются до того, как объявлен любой объект класса. Статические данные члены создаются автоматически при запуске программы и инициализируются нулем, если только мы не инициализируем их другим значением.
Статические функции-члены класса.
Объявляя функцию-член класса как статическую, мы делаем ее независимой от любого конкретного объекта класса. Обращения членам класса из статической функции члена должно выполняться с использованием квалифицированных имен.
Статическая функция-член обладает таким преимуществом, что она существует и может быть вызвана даже тогда, когда еще не существует ни одного объекта данного класса. В этом случае в ней могут использоваться только статические данные члены класса, поскольку на этот момент только они и существуют.
Таким образом, статическая функция-член может быть вызвана для проверки статических данных-членов, даже если мы не знаем, существуют ли объекты этого класса и если они существуют, то сколько. Статическая функция-член может обращаться как к приватным, так и к общедоступным членам класса.
Static int Function(int N);
aBox.Function(5);
Box::Function(5);