Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [ 31 ] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

private:

int TwiceC int i );

int mainC) { Calс с;

PMember p = c.CoughltUp C); Дает доступ к TwiceCint) return (c.*p)C 21 ); ok

Cm. также [Newkirk97], где описывается полезное применение преднамеренной утечки деталей закрытой реализации,

Итак, мы получили еще одну часть ответа на вопрос о закрытых членах.

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

И наконец, имеется еще один способ, которым некоторые классы могут переносимо и в полном соответствии со стагщартом дать всем права доступа к закрытому члену: эго щаблоны членов. В задаче 15 мы рассмотрели несколько способов получения доступа к закрытым частям класса. Большинство из них не законны , но один из них стопроцентно соответствует стандарту.

пример 16-6: адаптированный пример 15-4

В заголовочном файле

class X { public:

tempiate<class T> void fС const T& t ) { ...

... private:

int private..;

В пользовательском коде

namespace {

struct Y {};

templateo

void x::f( const Y& ) {

private =2; Злобный смех

Что здесь произошло? Любой шаблон члена может быть специализирован для любого типа. Специализируя его для какого-то своего уникального типа (уникальность обеспечивается безымянным пространством имен), вы создаете собственную функцию-член, а член класса имеет доступ ко всем частям класса.

Итак, вот последняя часть ответа на вопрос о закрытых членах:

• Имя закрытого члена доступно только другим членам (включая явные инстанцирования шаблонов членов) и друзьям.

Резюме

Итак, насколько же закрыты закрытые члены? Вот что мы выяснили.

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



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



Задача 17. Инкапсуляция Сложность: 4

Что именно представляет собой инкапсуляция в применении к программированию на С+ + ? В чем именно смысл инкапсуляции и управления доступом для членов-данных -- должны ли они иногда быть открытыми или защищенными? В этой задаче мы получим ответы на приведенные вопросы и узнаем, как эти ответы могут повлиять на надежность кода.

Вопрос для новичка

1. Что такое инкапсуляция? Насколько она важна в объектно-ориентированном проектировании и программировании?

Вопрос для профессионала

2. В каких случаях (если таковые имеются) нестатические члены данных должны быть сделаны открытыми (public), защищенными (protected) и закрытыми (private)? Выразите ват ответ в виде рекомендации программисту.

3. Шаблон класса std::pair использует открытые члены-данные, поскольку он не инкапсулирует никаких данных, а просто позволяет их группировать. Представим щаблон класса наподобие std::pai г, но с тем отличием, что у него дополнительно имеется флаг deleted, который может быть установлен и опрошен (но не сброшен). Ясно, что такой флаг должен быть закрытым для защиты от непосредственного изменения пользователем. Если остальные члены-данные будут открытыми, как в std: :pai г, в конечном итоге мы получим примерно следующий код.

template<class т, class и> class couple { publiс:

Основные члены-данные открыты...

Т first; и second;

.. .но есть еще нечто, делающее его более "классоподобным", а также закрытая реализация coupleO : deleted (false) {.

void MarkDeleted() { deleted = true; ] bool isDeletedO { return deleted ; } private:

bool deleted„;

Должны ли в этом случае остальные члены-данные быть, как показано в коде, открытыми? Почему? Если да, то является ли этот код хорошим примером того, почему иногда одновременное наличие открытых и закрытых данных в одном классе может быть удачным решением?

Решение

1. Что такое инкапсуляция?

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [ 31 ] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85