Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования.docx
Скачиваний:
3
Добавлен:
27.08.2019
Размер:
45.68 Кб
Скачать

Доступ к приватным членам класса

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

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);