Программирование >>  Программирование на языке c++ 

1 ... 24 25 26 [ 27 ] 28 29 30 ... 159


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;



1 ... 24 25 26 [ 27 ] 28 29 30 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика