|
Программирование >> Структурное программирование
Можно изменять закрытую переменную класса Count, так как setX объявлена как дружественная функция класса Count void setX(Count &c, int val) { val; разрешено: setX - друг Count main() { Count object; cout object.x после своего создания: ; object.print(); cout object.x после вызова дружественной функции setX: setX(object, 8); задание x другом object.print 0; return 0; object.x после своего создания: О object.x после вызова дружественной функции setX: 8 Рис. 7.5. Друзья могут иметь доауп к закрытым элементам класса (чааь 2 из 2) Программа на рис. 7.6 демонстрирует сообщения, вырабатываемые компилятором, когда для изменения закрытого элемента данных х вызывается функция cannotSetX, не являющаяся дружественной. Рисунки 7.5 и 7.6 предназначены для ознакомления с формальным механизмом использования дружественных функций; практические примеры использования дружественных функций появятся в последующих главах. FIG7 6.CPP Функции не друзья или не элементы не могут иметь доступ к закрытым элементам класса, iinclude <iostream.h> Измененный класс Count class Count { public: Count 0 { X = 0; } void print() const { cout private: int x; Функция пытается изменить закрытые данные класса Count, но не может, так как она - не друг Count, void cannotSetX(Count Sc, int val) X endl; элемент данных конструктор выход val; ОШИБКА: Count::х недоступна mam () { Count object; cannotSetX(object, 3) ; return 0; } cannotSetX не друг Рис. 7.6. Функции, не яфляющиеся друзьями или элементами, не могут иметь доауп к закрытым элементам класса (чааь 1 из 2) Compiling FIG7 6.CPP: Error FIG7 6.CPP 17: Count::x is not accessible Warning FIG7 6.CPP 18: Parameter c is never used Warning FIG7 6.CPP 18: Parameter val is never used Рис. 7.6. Функции, не яфляющиеся друзьями или элементами, не могут иметь доауп к закрытым элементам класса (часть 2 из 2) Друзьями класса можно определить перегруженные функции. Каждая перегруженная функция, предназначенная в друзья, должна быть явно объявлена в описании класса как друг этого класса. 7.5. Использование указателя this Когда функция-элемент ссылается на другой элемент какого-то объекта данного класса, откуда у С-Н- берется уверенность, что имеется ввиду соответствующий объект? Ответ заключается в том, что каждый объект сопровождается указателем на самого себя - называемым указателем this - это неявный аргумент во всех ссылках на элементы внутри этого объекта. Указатель this можно использовать также и явно. Каждый объект может определить свой собственный адрес с помощью ключевого слова this. Указатель this неявно используется для ссылки как на данные-элементы, так и на функции-элементы объекта. Тип указателя this зависит от типа объекта и от того, объявлена ли функция-элемент, в которой используется this, как const. В неконстантной функции-элементе класса Employee указатель this имеет тип Employee * const (константный указатель на объект Employee). В константной функции-элементе класса Employee указатель this имеет тип const Employee * const (константный указатель на объект Employee, который тоже константный). А теперь мы покажем простой пример явного использование указателя this; позже мы представим несколько реальных сложных примеров использования this. Каждая функция-элемент имеет доступ к указателю this на объект, для которого вызван этот элемент. Совет по повышению эффективности 7.2 С целью экономии памяти для каждой функции-элемента существует только одна копия на класс и эта функция-элемент вызывается каждым объектом данного класса. С другой стороны, каждый объект имеет свою собственную копию данных-элементов класса. Программа на рис. 7.7 демонстрирует явное использование указателя this, чтобы дать возможность функции-элементу класса Test печатать закрытую переменную х объекта Test. С иллюстративными целями функция-элемент print на рис. 7.7 сначала печатает х непосредственно. Затем программа использует две различных записи для доступа к х посредством указателя this - операцию стрелки (->), примененную к указателю this, и операцию точка (.) для разыменования указателя this. FIG7 7.CPP Использование указателя this для ссылки на объекты-элементы. #include <iostream.h> class Test { public: Test (int = 0); void print 0 const; private: int x; Test::Test(int a) { x = г void Test::print() const { конструктор no умолчанию конструктор X endl cout this->x = this->x endl (*this).x = (*this).x endl; main() { Test a(12); a.print 0; return 0; X = 12 this->x = 12 (♦this).X = 12 Рис. 7.7. Использование указателя this Отметим круглые скобки, в которые заключено *this, когда используется операция доступа к элементу точка (.). Круглые скобки необходимы, так как операция точка имеет более высокий приоритет по сравнению с операцией *. Без круглых скобок выражение *this.x оценивалось бы так же, как если бы были круглые скобки следующего вида *(this.x) Компилятор С++ воспринял бы это выражение как синтаксическую отпиб-ку, так как операция доступа к элементу не может быть использована с указателем. Типичная ошибка программирования 7.7 Попытка использовать операцию доступа к элементу (.) с указателем на объект (операцию доступа к элементу точка можно использовать только с объектом или со ссылкой на объект).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |