|
Программирование >> Программирование на языке c++
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(). Так, если задать вторую глобальную функцию с
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |