Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция9.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
124.42 Кб
Скачать

Int GetN() {return n;}

}

При указании на элементы данных внутри класса описывать частный экземпляр класса не нужно!

CTest Test1;

CTest *PTest2=new CTest;

// вызывается копия Test1

cout<<Test1.N<<”\n”;

// вызывается копия Test1

cout<<PTest2->N<<”\n”;

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

Пример: Test1.GetN();

Компилятор передает скрытый указатель GetN на объект Test1. Метод GetN точно использует этот указатель для доступа к копии N, принадлежащей объекту Test1.

Непосредственный доступ обеспечивает ключевое слово this. Внутри метода this является предопределенным указателем, который содержит адрес объекта, на который ссылается вызов функции.

Пример: int GetN() {return this->N;}

Если нужен доступ к глобальным элементам данных или к функции, которая имеет такое же имя как данные класса или метод класса, надо перед именем поставить оператор расширения области видимости (::).

Пример:

int N=0; // глобальная переменная

class CTest

{ public: int N;

Int GetN() {return n;}

Int Demo()

{

cout<<::N<<”\n”; // глобальная переменная N

cout<<N<<”\n”; // доступ к N с помощью this

}

}

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

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

Пример:

class CTest

{

public:

static int Count;

}

Здесь существует единственная копия Count.

Кроме объявления статического элемента данных внутри класса, необходимо определить и инициализировать эти данные вне класса как глобальные элементы данных

Пример:

// определение вне класса

int CTest::Count=0;

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

Пример:

Void main()

{ CTest::Count=1;

*****

}

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

Методы также могут быть статическими.

Пример:

class CTest

{ public: int N;

static int GetN() {return N;}

}

Статический метод обладает следующими свойствами:

  1. Вызов методы может быть произведен без ссылки на экземпляр класса.

Пример:

Void main()

{

int Count=CTest::GetCount();

}

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

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

Пример: подсчет текущего количества экземпляров класса.

#include<iostream.h>

class CTest

{ private: Static int Count;

public:

CTest() { ++Count; }

~CTest() { --Count; }

static int GetCount() { return Count; }

}

Int CTest::Count=0;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]