|
|
Функция, описанная как член (без спецификации friend $$R.11.4), называется функция-член и вызывается в соответствии с синтаксисом члена класса ($$R.5.2.4), например:
struct tnode { char tword[20]; int count; tnode *left; tnode *right; void set(char*, tnode* l, tnode *r); };
Здесь set является функцией-членом и может вызываться так:
void f(tnode n1, tnode n2)
{
n1.set("abc",&n2,0);
n2.set("def",0,0);
}
Считается, что определение функции-члена принадлежит области видимости ее класса. Это означает, что в функции-члене (если она нестатическая, $$R.9.4) можно непосредственно использовать имена членов ее класса. В статической функции-члене можно непосредственно использовать имена только статических членов, элементов перечисления и вложенных типов. Если определение функции-члена находится вне описания класса, ее имя следует уточнить именем класса с помощью операции ::, например:
void tnode::set(char* w, tnode* l, tnode* r) { count = strlen(w)+1; if (sizeof(tword)<=count) error("tnode string too long"); strcpy(tword,w); left = 1; right = r; }
Обозначение tnode::set указывает, что функция set является членом и
находится в области видимости класса tnode. Имена членов tword,
count, left и right относятся к членам того объекта, с именем
которого вызывалась Поэтому в вызове n1.set("abc",&n2,0) tword
обозначает n1.tword, а в вызове n2.set("def",0,0) tword обозначает
n2.tword. Функции strlen, error и strcpy должны быть описаны где-то
в программе.
Члены можно определять ($$R.3.1) вне описания класса; если в
описании класса они были описаны, но не определены, их не следует
описывать заново, см. $$R.3.3. После определения класса
функции-члены этого класса можно использовать при описании друзей.
Всякая вызываемая в программе функция-член должна иметь в точности
одно определение.
Результат вызова нестатической функции-члена ($$R.9.4) класса X,
когда она вызывается не с объектом класса X, неопределен.
| |