Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 478; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.183.1 (0.017 с.) |