Уточнение Имени Члена
Иногда полезно делать явное различие между именами членов класса и прочими именами. Для этого используется операция :: разрешения области видимости:
class x { int m; public: int readm() { return x::m; } void setm(int m) { x::m = m; } };
В x::setm() имя параметра m прячет член m, поэтому единственный способ сослаться на член - это использовать его уточненное имя x::m. Операнд в левой части :: должен быть именем класса.
Имя с префиксом :: (просто) должно быть глобальным именем. Это особенно полезно для того, чтобы можно было использовать часто употребимые имена вроде read, put и open как имена функций членов, не теряя при этом возможности обращаться к той версии функции, которая не является членом.
Например:
class my_file { // ... public: int open(char*, char*); };
int my_file::open(char* name, char* spec) { // ... if (::open(name,flag)) { // использовать open() из UNIX(2) // ... } // ... }
Вложенные Классы
Описание класса может быть вложенным. Например:
class set { struct setmem { int mem; setmem* next; setmem(int m, setmem* n) { mem=m; next=n; } }; setmem* first; public: set() { first=0; } insert(int m) { first = new setmem(m,first);} // ... };
Если только вложенный класс не является очень простым, в таком описании трудно разобраться. Кроме того, вложение классов - это не более чем соглашение о записи, поскольку вложенный класс не является скрытым в области видимости лексически охватывающего класса:
class set { struct setmem { int mem; setmem* next; setmem(int m, setmem* n) }; // ... };
setmem::setmem(int m, setmem* n) { mem=m, next=n} setmem m1(1,0);
Такая запись, как set::setmem::setmem(), не является ни необходимой, ни допустимой. Единственный способ скрыть имя класса - это сделать это с помощью метода файлы-как-модули. Большую часть нетривиальных классов лучше описывать раздельно:
class setmem { friend class set; // доступ только с помощью членов set int mem; setmem* next; setmem(int m, setmem* n) { mem=m; next=n; } };
class set { setmem* first; public: set() { first=0; } insert(int m) { first = new setmem(m,first);} // ... };
1 2 3 4
8 8 8
|