Статические поля

Статические элементы класса

Перегрузка операции индексирования

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

#include <iostream.h> #include <stdlib.h> class Vect{ int* p; int size; public: Vect(int n = 10); Vect(const int a[], int n); //инициализация массивом ~Vect() { delete [] p; } int operator [] (int i); void Print(); ... }; Vect::Vect(int n){ size=n; p = new int[n]; } Vect::Vect(const int a[], int n){ size=n; p = new int[n]; for (int i = 0; i < size; i++) p[i] = a[i]; } // Перегрузка операции индексирования: int Vect::operator [] (int i){ if(i < 0 || i >= size){ cout << "Неверный индекс (i = " << i << ")" << endl; cout << "Завершение программы" << endl; exit(0); } return p[i]; } void Vect::Print(){ for (int i = 0; i < size; i++) cout << p[i] << " "; cout << endl; } int main(){ int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Vect a(arr, 10); a.Print(); cout << a[5] << endl; return 0; }

Перегруженная операция индексирования получает целый аргумент и проверяет, лежит ли его значение в пределах диапазона массива. Если да, то возвращается адрес элемента, что соответствует семантике стандартной операции индексирования.


Лекция 5. Статические элементы класса. Дружественные функции и классы

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

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

Ниже перечислены особенности статических полей.

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

class A{

public:

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

};

...

int A::count; // Определение в глобальной области

// По умолчанию инициализируется нулем

// int A::count = 10; Пример инициализации произвольным значением

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

A *a, b;

...

cout << A::count << a->count << b.count; // Будет выведено одно и то же

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: