Обращение к статическим данным-членам...226
Правила обращения к статическим данным-членам те же, что и к обычным членам. Из класса к статическим членам обращаются так же, как и к другим членам класса. К открытым статическим членам можно обращаться извне класса, а к защищённым — нельзя, как и к обычным защищённым членам.
class Student
{
public :
Student( )
{
noOfStudents++ ; /* Обращение из класса */
/* ...остальная программа... */
}
static int noOfStudents ;
/* ...то же, что и раньше... */
} ;
void fn( Student& s1 , Student s2 )
{
/* Обращение к открытому статическому члену */
cout << "Количество студентов - "
<< s1.noOfStudents /* Обращение извне Класса */
<< " " ;
}
В функции fn( ) происходит обращение к noOfStudents с использованием объекта s1. Однако, поскольку s1 и s2 имеют одинаковый доступ к члену noOfStudents, возникает вопрос: почему я выбрал именно s1? Почему я не использовал s2? На самом деле это не имеет значения. Вы можете обращаться к статическим членам, используя любой объект класса, например, так:
/* ...Класс определяется так же, как и раньше... */
void fn( Student& s1 , Student s2 )
{
/* Представленные команды приведут к идентичному результату */
cout << "Количество студентов - "
<< s1.noOfStudents <<" " ;
cout << "Количество студентов - "
<< s2.noOfStudents << " " ;
}
На самом деле нам вообще не нужен объект! Можно использовать просто имя класса, как показано в следующем примере:
/* ...Класс определяется так же, как и раньше... */
void fn( Student& s1 , Student s2 )
{
/* Результат остаётся неизменным */
cout << "Количество студентов - "
<< Student::noOfStudents
<< " n" ;
}
Независимо от того, будете ли вы использовать имя объекта или нет, С++ всё равно будет использовать имя класса.
_________________
226 стр. Часть 3. Введение в классы
«Объект, используемый для обращения к статическому члену, никак не обрабатывается, даже если это обращение явным образом указано в выражении. Для того чтобы понять, что я имею в виду, рассмотрим приведённый ниже пример.»
[Технические подробности]
class Student
{
static int noOfStudents ;
Student& nextStudent( ) ;
/* ...To же, что и раньше... */
} ;
void fn( Student& s )
{
cout << s.nextStudent( ).noOfStudents
<< " " ;
}
Функция-член nextStudent( ) в этом примере не должна вызываться. Всё, что нужно знать С++ для обращения к noOfStudents, — тип возвращаемого значения, а он может это выяснить и не выполняя данную функцию[ 15 ].
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ