|
Программирование >> Программирование на языке c++
public: void set string{char*) {strcpy (str,s); } void display string(void) const{cout str endl;} { х+=М.х; у+=М.у; return *this; } В заключение перечислим основные свойства и правила использования указателя this: каждый новый объект имеет свой скрытый указатель this; -♦ this - это новое ключевое слово языка С++; >- this указывает на начало своего объекта в памяти компьютера; this не надо дополнительно объявлять; this передается как скрытый аргумент во все нестатические (т. е. не имеющие спецификатора static) компоненты-функции своего объекта; this - это локальная переменная, которая недоступна за пределами объекта (она доступна только во всех нестатических компонентах-функциях своего объекта); разрещается обращаться к указателю this (конечно, там, где он доступен) непосредственно в виде this или *this (см. приведенный выще пример). 3.3. Ограничение доступа к компонентам объекта (использование спецификатора const) Функция класса может быть объявлена так, что ей разрещается только читать значения компонентов-данных этого класса и не разрещается изменять эти значения. Подобные функции должны быть объявлены с суффиксом const (т. е. между именем функции и ее телом записывается ключевое слово const). Рассмотрим пример: class string { char str[25] ; char* return string(void) { return str; } Теперь все функции нашего класса делятся на две группы: const функции (display string) и обычные функции (set string и return string). Функции первой группы могут быть вызваны для объектов со спецификатором const, а функции второй группы - не могут. Рассмотрим пример: string str1; const string str2; str1.set string( University of Aveiro ); нет ошибки str1.display string(); нет ошибки str2. display string{); нет ошибки (хотя этот вызов без инициализации str не имеет смысла str2.set string( University of Minsk ); ошибка Для функций со спецификатором const класса my class указатель this имеет следующий тип: const my class *const this; Это означает, что невозможно изменить значение компонента объекта через указатель this без его явной записи. Рассмотрим пример: class my class { int i; void implicit (void) const { i~; } ошибка void explicit (void) const { ((my class*)this->i-; } нет ошибки Если функция класса объявляется в классе и далее описывается отдельно, то спецификатор const должен быть записан как при объявлении, так и при описании этой функции. Приведенный ниже пример программы демонстрирует различные возможности использования спецификатора const. #include <iostream.h> class my class { int x,y; public: void read(int& X,int& Y) const { X=x; Y=y; } void write(int X.int Y) { x=X; y=Y; } void displayO const; void i{void) const { x++; } ошибка void e(void) const { ((my class*)ttiis)->x++; } нет ошибки void my class::displayO const здесь тоже надо за- писать const { cout X \t У end); } void main(void) { int x,y; my class A; объявление объекта A A.write(25,36); A.displayO; Результат: 25 36 A.e(); увеличение A::x на единицу A.read(x,y); Результат: 26 36 cout X V У endl; const my class B=A; объявление объекта В B=A; ошибка B.write{125,136); предупреждение Из приведенного примера видно, как можно запретить случайное изменение компонентов-данных объекта из функций этого объекта. Для этого надо объявить функцию со спецификатором const. В результате для изменения компонентов-данных в теле этой функции необходимо записывать сложные конструкции вида ((имя клacca*)this)->. Если же эти конструкции в действительности используются, то, вероятнее всего, они не являются случайными. Такие конструкции можно рассматривать как некоторые исключения, которые при необходимости вводятся в функции со спецификатором const для того, чтобы сделать их более гибкими. В заключение перечислим основные правила использования спецификатора const для специального доступа к компонентам-данным: >- компоненты-функции со спецификатором const можно вызвать для объектов со спецификатором const;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |