Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Константные члены класса. Модификатор constСодержание книги Поиск на нашем сайте
Все информационные члены класса, не являющиеся статическими инфор-мационными членами, можно представлять, как данные, доступные методу класса через указатель this (в случае необходимости этот указатель можно употреблять явно).
Если необходимо запретить методу изменять информационные члены объ-ектов класса, то при его описании используется дополнительный модификатор const:
Описанные таким образом методы класса называются константными.
Тем не менее, статические члены класса могут изменяться такой функцией, так как они являются частью класса, но не объекта. Если же статические инфор-мационные члены класса имеют дополнительный модификатор const, то они не могут изменяться никакими методами класса.
Примечание. В некоторых изданиях(см.,например, [9]стр. 144,п.5.8.Функ-ции-члены типа static и const) данные, доступные через указатель this, рас-сматриваются как неявные аргументы метода класса. Конечно, можно рассматривать глобальные переменные также в качестве неявных параметров для всех функций, а не только методов класса. Тем не менее, если дать определение неявных аргументов метода класса как данных, доступных через указатель this, то вышеописанное можно сформулировать следующим образом: константные методы не могут изменять свои не-явные аргументы.
Таким образом, если объект типа описанного класса является константным объектом,то есть он объявленcмодификатором 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; просмотров: 589; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.10 (0.008 с.) |