Cовместное использование элемента данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Cовместное использование элемента данных



 

Обычно, когда вы создаете объекты определенного класса, каждый объект получает свой собственный набор элементов данных. Однако возможны такие ситуации, при которых объектам одного и того же класса необходимо совестно использовать один или несколько элементов данных. В таких случаях объявляйте элементы данных как общие или частные, а затем предваряйте тип ключевым словом static, как показано ниже:

public:

static int shared_value;

или

private:

static int shared_value;

После объявления класса вы должны объявить элемент как глобальную переменную вне класса, как показано ниже:

int class_name::shared_value;

Рассмотрим пример:

//---------------------------------------------------------------------------

#pragma hdrstop

#include <iostream.h>

#include <conio.h>

 

class T

{

 public:

static int ObCount;

T(){ObCount++;}

~T(){ObCount--;}

//…….

 private:

int x;

 

};

int T::ObCount = 0;

#pragma argsused

int main()

{const int N=5;

T *pOb[N];

for (int i=0; i<N; i++)

pOb[i] = new T;

cout <<"\n Sozdano "<< T::ObCount<< " object classa T";

for (int i=0; i<N-2; i++)

delete pOb[i];

cout <<"\n Ostalos "<< T::ObCount<< " object classa T";

getch();

return 0;

}

При выполнении программа выводит на экран:

Sozdano 5 object classa Т.

Ostalos 2 object classa T.

В этом примере статический элемент данных ObCount объявлен в разделе public, изменяется с помощью конструктора и деструктора и ведет учет созданных объектов.

Следующая программа определяет класс book_series, совместно использующий элемент page_count, который объявлен в разделе private и является одинаковым для всех объектов (книг) класса (серии). Если программа изменяет значение этого элемента в одном объекте, изменение сразу же проявляется во всех объектах класса. Доступ к элементу page_count возможен только с помощью функции-элемента void set_pages (int).

 

#include < iostrearn.h>

# include <string.h>

 

class book_series

{

public:

book_series(char *, char *, float);

void show_book(void);

void set_pages (int);

private:

static int page_count;

char title [64];

char author [64];

float price;

};

 

int book_series::page_count;

void book_series::set_pages (int pages)

{

page_count = pages;

}

 

book_series::book_series(char *title, char "author, float price)

{

strcpy(book_series::title, title);

strcpy(book_series::author, author);

book_series::price = price;

}

void book_series::show_book(void)

{

cout «"Заголовок: " «title «endl;

cout «"Автор: " «author «endl;

cout «"Цена: " «price «endl;

cout «"Страницы: " «page_count «endl;

}

void main(void)

{

book_series programming("Учимся программировать на C++", "Jamsa", 22.95);

book_series word("Учимся работать с Word для Windows", "Wyatt", 19.95);

word.set_pages(256);

programming.show_book();

word.show_book();

cout «endl «"Изменение page_count " «endl;

programming.set_pages(512);

programming.show_book();

word.show_book();

}

Как видите, класс объявляет page_count как static int. Сразу же за определением класса программа объявляет элемент page_count как глобальную переменную. Когда программа изменяет элемент page_count, изменение сразу же проявляется во всех объектах класса book_series: programming и word.

 

Использование элементов данных с атрибутами public static, если объекты не существуют.

 

При объявлении элемента класса как static этот элемент совместно используется всеми объектами данного класса. Однако возможны ситуации, когда программа еще не создала объект, но ей необходимо использовать элемент. Для использования элемента ваша программа должна объявить его как public и static. Например, следующая программа использует элемент page_count из класса book_series, даже если объекты этого класса не существуют:

#include <iostream.h>

#include <string.h>

class book_series

{

 public:

static int page_count;

 private:

char title[64];

char author[64];

float price;

}

int book_series::page_count;

 

void main(void)

{

book_series::page_count = 256;

cout «"Текущее значение page_count равно " «book_series::page_count «endl;

}

В данном случае, поскольку класс определяет элемент класса page_count как public, программа может обратиться к этому элементу класса, даже если объекты класса book_series не существуют.

Таким образом, статические элементы данных применяются для хранения данных, общих для всех объектов класса, например, количества объектов или ссылки на разделяемый всеми объектами ресурс. Ниже перечислены особенности статических элементов данных:

• Эти элементы данных существуют для всех объектов класса в единственном экземпляре, то есть не дублируются.

• Память под статический элемент данных выделяется один раз при его инициализации независимо от числа созданных объектов (и даже при их отсутствии) и инициализируется с помощью операции доступа к области действия(определение должно быть записано вне функций):

class A

{

public:

static int count;     // Объявление в классе

………..

};

 

int A::count;  // Определение в глобальной области, по умолчанию инициализируется нулем

int A::count = 10;  //Пример инициализации значением 10

• Статические элементы данных доступны как через имя класса, так и через имя объекта:

А *а, b;

 

cout «A:: count;

cout «a->count;

cout «b. count;

Здесь будет выведено одно и то же

• На статические элементы данных распространяется действие спецификаторов доступа, поэтому статические элементы данных, описанные как private, нельзя изменить с помощью операции доступа к области действия, как описано выше. Это можно сделать только с помощью функций-элементов (статических функций-элементов (см. далее)).

• Память, занимаемая статическим элементом данных, не учитывается при определении размера объекта с помощью операции sizeof.

 

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.226.105 (0.009 с.)