logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.9.3 Функции-члены

Функция, описанная как член (без спецификации 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, неопределен.