    16:	int i ; 
    17:	TFirstClass fc; 
    18: 
    19:	cout « "\nCall Access the normal way:\n"; 
    20:	for ( i = 0 ; i < 9 ; i++ ) 
    21:	   cout « setw(8) « dec « fc.Access() ; 
    22:	cout « "\n\nCall Access via the member function pointer\n"; 
    23:	myfnptr = &TFirstClass::Access; 
    24:	for ( i = 0 ; i < 9; i++ ) 
    25:	   cout « setw(8) « dec « (fc.*myfnptr)() ; 
    26:	cout « "\n\nMember function pointer and a dynamic instance\n"; 
    27:	TFirstClass *fp = new TFirstClass ; 
    28:	for (i = 0; i < 9; i++) 
    29:	   cout « setw(8) « dec « (fp->*myfnptr)(); 
    30:	return 0; 
    31:	} 
    32: 
    33:	int TFirstClass::Access(void) 
    34:	{ 
    35:	  return count++ ; 
    36:	} 

    В строке 12 myfnptr объявляется указателем на функцию-член класса 
TFirstClass, не имеющую аргументов и возвращающую целочисленное значение. 
Указатель может ссылаться на любые функции-члены класса, имеющие подобный вид. 
    В функции main() в строке 17 объявляется объект fc класса TFirstClass, в 
строке 21 вызывается функция-член Aceess() класса TFirstClass для объекта fc 
обычным способом. (Функция Access() только инкрементирует и возвращает 
закрытый член класса — должно же в программе хоть что-нибудь выполняться!) 
    В строке 25 демонстрируется вызов функции-члена Access() с помощью 
указателя myfnptr. Для инициализации указателя в строке 23 указателю myfnptr 
присваивается адрес функции-члена Access() класса TFirstClass. Вы можете также 
заменить объявление указателя (строка 12) и присваивание (строка 23) одним 
оператором, глобальным или локальным в функции main(): 

    int (TFirstClass::*myfnptr)(void) = &TFirstClass::Access; 

    При вызове по указателю функции-члена вы должны придерживаться следующих 
двух правил. 
    •  Обращайтесь к объекту класса. 
    •  Заключайте в круглые скобки вызов функции. 
    Например, если п — целочисленная переменная, и fс — объект класса 
TFirstClass, следующая строка присвоит n результат функции Access(): 

    n = (fc.*myfnptr)(); 

    Двухсимвольное выражение .* называется оператором ссылки на член и служит 
для разыменования указателя на функцию-член объекта класса. Круглые скобки в 
выражении (fс.'myfnptr) необходимы, поскольку оператор вызова функции () имеет 
более высокий приоритет, чем .*. Оператор, приведенный выше, в точности 
соответствует более распространенному 

    п = fс. Access(); 

    Можно также вызывать функции-члены с помощью указателей, когда объекты 
адресуются другими переменными-указателями. Например, вернемся к строкам 27-29 
в модуле MFNPTR (листинг 15.14). Сначала указателю fp присваивается адрес 
нового объекта класса TFirstClass. Затем в выражении 

    (fp->*myfnptr)(); 

в операторе вывода в поток в строке 29 вызывается функция-член Access() для 
объекта, адресованного указателем fp. Трехсимвольное выражение ->* — другой 
вид оператора ссылки на член. Опять же, необходимы дополнительные скобки, 
поскольку операция () имеет более высокий приоритет, чем ->*. Предыдущий 
оператор в точности соответствует следующему: 

    fp->Access(); 

    В дополнение к адресации функций-членов указателями, можно также ссылаться 
на другие открытые члены класса. Например, если бы класс TFirstClass имел 
открытый член типа double с именем balance, вы могли бы объявить указатель на 
этот член следующим образом: 

    double TFirstClass::*dataPtr; 

    Указатель dataPtr объявляется для адресации любых открытых данных-членов в 
классе TFirstClass, имеющих тип вещественных значений двойной точности. Для 
инициализации указателя следует использовать оператор, подобный следующему: 

    dataPtr = &TFirstClass::balance ;	


    Глава 15. Передовые средства C++     395 
