Кіріспе
C++-дағы достар класы достар деп жарияланған кластың жеке және қорғалған мүшелеріне кіре алады. Дос класының маңызды қолданылуы - бұл дерек құрылымының бір бөлігі, ол осы дерек құрылымын білдіретін негізгі класқа қол жеткізуді қамтамасыз ету үшін. Дос класының механизмі деректер құрылымының пайдаланушылары көріп отырғандай дұрыс инкапсуляцияны сақтай отырып, бөлшектерге сақтау мен қол жеткізуді кеңейтуге мүмкіндік береді. Дос класына ұқсас, дос функциясы - бұл досы ретінде жарияланған сыныптың жеке және қорғалған мүшелеріне қол жетімділік берілген функция.
Капсулалау
Дос кластарды дұрыс пайдалану инкапсуляцияны арттырады, өйткені ол дерек құрылымының жеке кіруін басқа сыртқы сыныптарға жеке кіруді рұқсат етпей, дерек құрылымының иелігіндегі бөліктеріне кеңейтуге мүмкіндік береді. Осылайша деректер құрылымы сырттан деректер құрылымының инварианттарын бұзуға арналған кездейсоқ әрекеттерден қорғалады. Бір сыныптың өзіне басқа сыныптың жеке бөлігіне кіру мүмкіндігін бермейтінін ескерген жөн. Бұл инкапсуляцияны бұзады. Керісінше, бір сынып өзінің жеке бөліктеріне басқа сыныпқа досы ретінде жариялау арқылы қол жетімділік береді. График мысалында Graph өзін Vertex досы деп жариялай алмайды. Керісінше, Vertex Graph-ты досы деп жариялайды, сондықтан Graph-қа жеке өрістеріне кіру мүмкіндігін береді. Сынып өз достарын өзі таңдайды деген сөз достастық жалпы алғанда симметриялы емес дегенді білдіреді. Граф мысалында Vertex Graph жеке өрістеріне кіре алмайды, бірақ Graph Vertex жеке өрістеріне кіре алады.
Баламалар
C#-тің ішкі кіруді өзгертуші кілт сөзінде ұқсас, бірақ эквивалентті емес тілдік ерекшелік берілген, ол бір ассемблидегі сыныптарға басқа сыныптардың жеке бөліктеріне кіруге мүмкіндік береді. Бұл әр сыныпты бір жиналыста басқасының досы деп белгілеуге сәйкес келеді; достар топтары ұсақ түйірлі. Дос кластарды немесе ұқсас тілдік ерекшелікті қолдамайтын бағдарламалау тілдері дерек құрылымына қауіпсіз бөліктерге негізделген интерфейске жету үшін айналмаларды іске асыруы керек. Мұндай айналып өтудің мысалдары: бөлшектердің өрістерін жария ету. Бұл шешім инкапсуляцияны азайтады, өйткені ол деректердің сыртқы құрылымының инварианттарын бұзуға мүмкіндік береді. Барлық өзгермелі құрылымдық деректерді бөлшектен дерек құрылымына көшіріңіз және әр бөлшектен оның дерек құрылымына кері бағыттауды енгізіңіз. Бұл шешім деректердің құрылымын ұйымдастырады және осы ақпаратқа қажеттілік болмаған жағдайларда жад тұтынуды арттырады.
Make the parts' fields public. This solution decreases encapsulation by making it possible to violate invariants of the data structure from outside. Move all mutable structural data away from the part to the data structure, and introduce indirection back from each part to its data structure. This solution changes the organization of the data structure, and increases memory consumption in cases where there would otherwise be no need for this information.
Қасиеттері
Достық симметриялы емес егер A класы B класының досы болса, B класы автоматты түрде A класының досы болмайды. Достық қатынастар транзитивті емес егер A класы B класының досы болса, ал B класы C класының досы болса, A класы автоматты түрде C класының досы емес. Достық қатынастар мұра етілмейді егер База класы X класының досы болса, Дериватты субклас автоматты түрде X класының досы емес; және егер X класы База класының досы болса, X класы Дериватты субкластың досы емес. Алайда, егер Y класы Derived субкласының досы болса, онда Y класы, Derived субкласы сияқты, Base класының қорғалған бөліктеріне де қол жетімді болады.
Friendships are not inherited – if class Base is a friend of class X, subclass Derived is not automatically a friend of class X; and if class X is a friend of class Base, class X is not automatically a friend of subclass Derived. However, if class Y is a friend of subclass Derived, class Y will also have access to protected portions of class Base, just as subclass Derived does.