Программирование >>  Программирование на языке c++ 

1 ... 33 34 35 [ 36 ] 37 38 39 ... 159


my class::a = 1.8265;

if(my class::b >= 5.6894) ..........

Обращение к статическим компонентам из тела компонента-функции этого же класса можно осуществлять просто по их имени, т. е. в вышеприведенном примере использовать имена а, Ь, с без префикса my class::.

Статическая память может рассматриваться как глобальная память (лучше сказать, общая память) для объектов одного класса. Ее использование позволяет сократить число действительно глобальных элементов в программе, а это всегда можно представить как достоинство программы.

Статическими могут быть как компоненты-данные, так и компоненты-функции:

class my class {

static double a,b,c; static void function(void);

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

double my class::a = 10.5; void my class::function(void)

{....................}

Статические компоненты с атрибутом private можно описать таким же образом.

Ключевое слово static не должно быть включено в описание статического компонента класса. Например, в приведенном выше описании функции:

void my class::function(void)

{....................}

спецификатор static не записан. В противном случае может возникнуть противоречие между статическими компонентами класса и статическими глобальными переменными и функциями.



В целом на статические элементы в языках С и С++ распространяются следующие два правила (о них уже говорилось в начале параграфа):

эти элементы занимают статическую область памяти, т. е. область памяти, которая выделяется и далее закрепляется за держателем статического компонента. Эта память является диаметрально противоположной по отношению к стековой памяти или динамически выделяемой и динамически освобождаемой памяти;

статические элементы имеют ограниченную видимость в программе (они как бы частично скрыты).

Заметим, что к статическим компонентам-функциям класса может быть применено только второе правило. Любая статическая компонент-функция (в отличие от глобальной функции) видна только в классе, в котором она объявлена (см. последний пример этого параграфа).

Рассмотрим первый пример:

#include <iostream.h> class my class { static a;

int b; public:

my class(int B) : b(B) {} конструктор static f(my class* p) { return p->b; } static ff{void) { return a; }

int my class;:a=10; статический компонент можно

инициализировать даже до описания соответствующих объектов

void main(void)

{ статическую функцию можно вызывать даже до описания соответствующих объектов cout my class::ff() endl; Результат: 10 my class М1(100);

cout M1.f(&M1) endl; Результат: 100



Второй пример показывает использование статической памяти в качестве общей памяти для всех объектов одного и того же класса.

#include <iostream.h> class my class { static a; public:

void set a{int A) { a=A; } get a(void) { return a; } };

int my class::a = 33;

void main(void)

{ my class mc1,mc2;

cout mc1.get a() << endl; Результат: 33 mc1.set a(155); установка в объекте 1 (mcl) cout mc2.get a() endl; Результат: 155 mc2.set a(1); установка в объекте 2 (mc2) cout mc1.get a{) endl; Результаг. 1

Из третьего примера видно, как используется статическая компонент-функция класса.

#include <iostream.h> class my class { static a; public:

static void f() { cout I am f << a endl; }

int my class::a=66; void main(void) { my class mc;

my class::f(); 1 am f 66

mc.fO; I am f 66

Здесь функция f() видна только в границах класса. Поэтому выше используется следующий вызов этой функции: my class::f(). Так, если задать вторую глобальную функцию с



1 ... 33 34 35 [ 36 ] 37 38 39 ... 159

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика