
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;}
}
Статический метод обладает следующими свойствами:
Вызов методы может быть произведен без ссылки на экземпляр класса.
Пример:
Void main()
{
int Count=CTest::GetCount();
}
Статический метод класса может непосредственно ссылаться только на статические элементы данных и методы, которые принадлежат к его классу. (Статический метод не имеет указателя this, содержащего адрес объекта)
Статические данные и методы могут быть использованы для обработки элементов данных, общих для всех экземпляров класса.
Пример: подсчет текущего количества экземпляров класса.
#include<iostream.h>
class CTest
{ private: Static int Count;
public:
CTest() { ++Count; }
~CTest() { --Count; }
static int GetCount() { return Count; }
}
Int CTest::Count=0;