Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
56
Добавлен:
15.06.2014
Размер:
478 Кб
Скачать
☆

Вопрос 8. Константные объекты и функции-члены.

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

Только константные ф-ции-члены могут оперировать константны­ми объектами. но не могут изменять объект — это не позволит компилятор.

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

int A::getValue() const {return privateDateMember};

которая просто возвращает значение одного из данных-элементов объекта. Константный объект не может быть изменен с помощью присваивания, так что он должен получить начальное значение.

Константная функция, аргументы которой совпадают с аргументами неконстантной функции, тем не менее считается другой функцией. Компилятор вызывает константную или неконстантную версию в зависимости от типа переменной, указывающей или ссылающейся на объект.

class Foo { public:

void Fn();

void Fn() const; // Другая функция!

};

Foo* f = new Foo;

f->Fn(); // Вызывается неконстантная версия

const Foo* f1 = f;

f1->Fn(); // Вызывается константная версия

Вопрос 9. Дружественные функции и друж. Классы.

Ф-я, не явл-ся членом класса, может иметь доступ к его членам, если она объявлена другом класса (ключ. слово friend). Ограничения: производные классы не наследуют друж. ф-й; друж. ф-и не могут объявляться с ключ. словами static, друзья не имеют указателя this; друзьями класса могут быть объявлены перегруж ф-ии.

Классы также могут быть друзьями других классов; в этом случае во всех ф-ях класса-друга видны все члены того класса, другом к-ого он является.

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

Дружественные функции используются для повышения производитель­ности. Чтобы объявить функцию как друга (friend) класса, перед ее прототипом в описании класса ставится ключевое слово friend..Дружественность требует разрешения, т.е. чтобы класс В стал другом класса А, класс А должен объявить, что класс В — его друг. Т.о. дружественность не обладает ни св-вом симметричности, ни св-вом транзитивности, т.е. если класс А — друг класса В, а класс В — друг класса С, то отсюда не следует, что класс В — друг класса А, что класс С — друг класса В, или что класс А — друг класса С.

#include <iostream.h>

// Измененный класс Count class Count{

friend void setX(Count &, int}; // объявление друга

public:

Count() { x = 0; } // конструктор

void print() const {cout « x <<endl;) // вывод private:

int x; // элемент данных

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