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;

*****

}

 

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

 

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

Пример: