Class CTest
Class CTest
Class CTest
{ public: int N;
// N указывается без ссылки на объект
int GetN() {return N;}
}
При указании на элементы данных внутри класса описывать частный экземпляр класса не нужно!
CTest Test1;
CTest *PTest2=new CTest;
// вызывается копия Test1
cout<<Test1.N<<” ”;
// вызывается копия Test1
cout<<PTest2->N<<” ”;
Для того, чтобы определить, на какую копию N ссылается метод, компилятор в действительности передает методу скрытый указатель на объект, на который ссылается вызов функции. Функция неявно использует этот скрытый указатель для доступа к правильной копии элемента данных.
Пример: Test1.GetN();
Компилятор передает скрытый указатель GetN на объект Test1. Метод GetN точно использует этот указатель для доступа к копии N, принадлежащей объекту Test1.
Непосредственный доступ обеспечивает ключевое слово this. Внутри метода this является предопределенным указателем, который содержит адрес объекта, на который ссылается вызов функции.
Пример: int GetN() {return this->N;}
Если нужен доступ к глобальным элементам данных или к функции, которая имеет такое же имя как данные класса или метод класса, надо перед именем поставить оператор расширения области видимости (::).
Пример:
int N=0; // глобальная переменная
{ public: int N;
int GetN() {return N;}
int Demo()
{
cout<<::N<<” ”; // глобальная переменная N
cout<<N<<” ”; // доступ к N с помощью this
}
}
Статические элементы данных
Обычно каждый экземпляр класса имеет свою собственную копию данных, принадлежащих классу. Если элемент данных объявить с ключевым словом static, то независимо от того, сколько экземпляров класса создается (даже если не создается ни одного), будет существовать единственная копия этого элемента данных.
Пример:
{
public:
static int Count;
}
Здесь существует единственная копия Count.
Кроме объявления статического элемента данных внутри класса, необходимо определить и инициализировать эти данные вне класса как глобальные элементы данных
Пример:
// определение вне класса
int CTest::Count=0;
Поскольку статические элементы данных существуют независимо от любого объекта класса, доступ к ним можно получить, используя имя класса и оператор :: без ссылки на экземпляры класса.
Пример:
void main()
{ CTest::Count=1;
*****
}
Подобно глобальной переменной, статический элемент данных определяется и инициализируется вне функции и представляет единую область памяти, которая существует на протяжении всей программы. Подобно обычным элементам данных, статический элемент данных имеет различные спецификации доступа.
Методы также могут быть статическими.
Пример: