Константные члены класса. Модификатор const 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Константные члены класса. Модификатор const



 

Все информационные члены класса, не являющиеся статическими инфор-мационными членами, можно представлять, как данные, доступные методу класса через указатель this (в случае необходимости этот указатель можно употреблять явно).

 

Если необходимо запретить методу изменять информационные члены объ-ектов класса, то при его описании используется дополнительный модификатор const:

 

 

Описанные таким образом методы класса называются константными.

 

Тем не менее, статические члены класса могут изменяться такой функцией, так как они являются частью класса, но не объекта. Если же статические инфор-мационные члены класса имеют дополнительный модификатор const, то они не могут изменяться никакими методами класса.

 

Примечание. В некоторых изданиях(см.,например, [9]стр. 144,п.5.8.Функ-ции-члены типа static и const) данные, доступные через указатель this, рас-сматриваются как неявные аргументы метода класса. Конечно, можно рассматривать глобальные переменные также в качестве неявных параметров для всех функций, а не только методов класса. Тем не менее, если дать определение неявных аргументов метода класса как данных, доступных через указатель this, то вышеописанное можно сформулировать следующим образом: константные методы не могут изменять свои не-явные аргументы.

 

Таким образом, если объект типа описанного класса является константным объектом,то есть он объявленcмодификатором const,это означает,что изме-нение его состояния недопустимо. В таком случае все применяемые к этому объекту методы (кроме конструкторов и деструктора) должны иметь модифи-катор const. Данное требование является обязательным независимо от нали-чия или отсутствия информационных членов в классе.

 

Для защиты от изменения передаваемых фактических параметров в теле функции соответствующие формальные параметры также объявляются с моди-фикатором const:

 

Тип идентифика тор  
const параметра  

 

Объявление методов класса и формальных параметров с модификатором const называется контролем постоянства.

 

Если необходимо запретить изменение объекта в пределах его области ви-димости, то при объявлении объекта используется ключевое слово const, на-пример:

 

const X x2 = x1;

 

Примечание. При объявлении объекта с модификатором const объект долженбыть обязательно инициализирован. Объект пользовательского типа может быть ини-циализирован неявно (например, с помощью конструктора класса), если в описании типа объекта указаны параметры, принимаемые по умолчанию при отсутствии в объявлении объекта явных параметров.

 

Пример:

 

#include <iostream> using namespace std; class A {

 

static int i;

 

void f() const { //модификатор const,запрещающий

 

// изменять неявные аргументы,

 

// необходим в связи с тем, что

// имеется объект данного класса с

 

// описателем const

 

if (i < 0) g(i);

 

cout << "f()" << endl;

}

public:

void g(const int & n) const {

 

// модификатор const для

 

// параметра–ссылки необходим в

// связи с использованием

// числовой константы 2 при вызове

 

// данного метода для объекта:

// a.g(2)

 

i = n; f();

cout << "g()" << endl;

 

}

 

};

 

int A::i = 1; // инициализация статической переменной

 

int main(){

 

const A a = A();a.g(2);

return 0;

 

}

 

Друзья классов

 

Имеется ряд ситуаций, когда объекту одного класса необходимо иметь прямой доступ к закрытым членам объекта другого класса без использования методов-селекторов. Для этого в языке C++ введена концепция друзей и специ-альное ключевое слово friend..

 

Друг класса – это функция, не являющаяся членом класса, но имеющая доступ к его закрытым и защищенным членам.

 

Друзья класса объявляются в самом классе с помощью служебного слова friend. в любой области доступа.

 

Другом класса может быть обычная функция, метод другого класса или другой класс (при этом каждый его метод становится другом класса).

 

Пример:

 

class B; //предварительное объявление идентификатора// b как идентификатора типа данных

 

class X { int ia1;

 

public:

 

X(){

 

ia1 = 0;

}

int func1(b& bb);

 

};

 

class B { int b1;

 

public:

 

friend int X::func1(B & bb);B(){

 

b1 = 1;

 

}

 

};

 

int X::func1(B & bb){ia1 = ia1 + bb.b1; return ia1;

 

}

 

int main(){ int i1;B b2;

 

X a2;

 

i1 = a2.func1(b2); return 0;

 

}

 

Примечание. Несмотря на предварительное объявление идентификатора B, егоможно использовать в описании класса X, находящемся перед описанием класса B,

 


только в описании формального параметра в прототипе функции (func1). Саму функ-цию func1 необходимо описывать вне класса X после описания классов B и X, ис-пользуя операцию разрешения области видимости ‘::’ с квалификатором X. Непра-вильным будет следующее описание функции func1:

 

class B;

 

class X {

 

int ia1; public:

 

X(){

 

ia1 = 0;

 

}

 

int func1(B & bb){

 

ia1 = ia1 + bb.b1; // ОШИБКА! return ia1;

 

}

 

};

 

class B {

 

int b1; public:

 

friend int X::func1(B & bb);B(){

 

b1 = 1;

 

}

 

};

 

int main(){ int i1;B b2;

 

X a2;

i1 = a2.func1(b2); return 0;

 

}

 

Другом можно объявить и весь класс: friend classХ;

 

Другом класса может быть не только метод другого класса, но и внешняя функция. Кроме того, возможна дружественность сразу для нескольких классов. Это необходимо, например, в случае организации взаимодействия нескольких объектов разных классов, когда функция, обеспечивающая взаимодействие, должна иметь доступ к закрытым компонентам одновременно нескольких объ-ектов. Объявить функцию методом одновременно нескольких классов невоз-можно, поэтому в стандарте языка С++ предусмотрена возможность объявлять внешнюю по отношению к классу функцию дружественной данному классу. Для этого необходимо в теле класса объявить некоторую внешнюю по отношению к классу функцию с использованием ключевого слова friend:

 

friend имя_функции (список_формальных_параметров);

 

Пример:

 

class B;

 

class D { int x;

...

friend void func(B &, D &); //функция дружественнаклассу D

 

...

 

};

 

class B { int y;

...

 

friend void func(B &, D &); //функция дружественна// классу B

 

...

 

};

 

void func (B & b1, D & d1) {

 

cout << d1.x + b1.y; // дружественная функция имеет // доступ к закрытым // компонентам обоих классов

 

}

 

Статический полиморфизм

 

Статический полиморфизм реализуется с помощью перегрузки функций и операций. Под перегрузкой функций в С++ понимается описание в одной об-ласти видимости нескольких функций с одним и тем же именем.О перегрузкеопераций в С++ говорят в том случае, если в некоторой области видимости по-является описание функции с именем operator <обозначение_операции_С++>, задающее еще одну интерпретацию заданной операции.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 477; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.93.73 (0.019 с.)