IT-приятелски функции диаманти
Приятелски функция клас е функция, която не е част от него, да има достъп до собствения си (частни) и защитени (защитени) компоненти. Функцията не може да бъде приятел на клас ", без негово съгласие." За права на други функции, за да бъдат описани в тялото на класа с приятеля на спецификатор. Това е наличието на такова описание на класа осигурява функцията на правото на достъп до защитени и частни компоненти.
Някои функции приятелски функции.
Приятелски функции в поканата не се получи това показалка.
Клас обекти трябва да бъдат предавани само привидно приятелски функции чрез настройките на устройството.
Приятел функции не могат да бъдат извикани чрез обекта на класа, те са приятели, както и чрез указатели към тези обекти. С други думи, следните действия са забранени:
Приятелският функция не са обхванати от спецификатор за достъп (публичен, защитена, частни), така че поставянето на приятелски функция прототип вътре дефиницията на клас е безразличен.
Приятелски функция не може да бъде компонент функция на класа във връзка с което се определя като приятелски, но може просто да бъде глобален функция, както и функцията на друг компонент на предварително дефиниран клас.
Приятелски функция може да бъде приятелски настроени към няколко класа.
Нещо за прилагането
С помощта на механизма на приятелски функции за опростяване на интерфейса между класовете. Например, един приятел функция ще осигури достъп до лично или защитен елемент от няколко класа. По този начин, класовете могат понякога да премахва функции съставните предназначени само за достъп до тези "скрити" компоненти.
Като пример, помислете за функцията на две класи "точката на самолет" и "правата линия на самолета."
Клас "точка на самолета" включва съставни данни за определяне на координатите (х, у) точка.
Компонент клас данни "линия на равнина" са коефициентите А, В, С прав общ уравнение А * х + у + B * C = 0.
Приятелски функция определя отклонението от заданието на дадена линия. Ако (а, Ь) - координатите на дадена точка, за да линия, в уравнението която включва коефициенти А, В, С, се изчислява като стойност на отклонение на експресия A * A + B * В + С
Програмата е описано по-долу, определени класове с приятелска обща функция в основната програма, въведена обекти от тези класове и изчислява отклонението от точка, за да ред:
Peregruzka.Itak приятелски, разгледахме приятелски функции и някои примери за тяхното прилагане. Въпреки това, един от основните свойства на тези конкретни функции е, че те могат да бъдат използвани за изпълнение на натоварването на оператори. Този вид претоварване се нарича приятелски.
Нека илюстрираме характеристиките на регистрация на работа функции, както приятелски функции класа.
#include
клас изпълнява да работи с Булева клас Flag
Определяне функция приятелски операция. (Това не се предава, така че параметър 1) флаг оператор! (Flag е) стойност подмяна на обратното
Резултатът от програмата:
Global претоварване. В C ++, но две известен сортове претоварване (претоварване в клас и приятелски претоварване), има и друга идея - глобален претоварване извършват по външния обхват.
Да предположим, че А и В са декларирани като клас С клас С обекти дефинирани оператор C :: оператор + (С), следователно,
A + B се a.operator + (б)
Въпреки това, той също така е възможно глобалното претоварване на оператора +:
Такова претоварване изпълнение се отнася и до експресионен А + В, където А и В се предават съответно в първата и втората функция параметър. От тези две предпочитани форми се счита за претоварване в класната стая. Т. к. Втората форма изисква открит призив към членовете на класа, а това оказва негативно влияние върху естетиката на строг капсулиране. Втората форма може да бъде по-удобно да се адаптира класовете, които са в библиотеката, където изходния код не може да се променя и perekompilirovat.To трябва да добавите към претоварване на клас като метод на клас е нереалистично.
Смесете тези две форми на програмата не се препоръчва. Ако операторът идентифицирани две форми на едни и същи видове формални параметри, а след това използвайте оператора може да създаде неяснота, че е вероятно да се окаже фатално.
Независимо от това, в световен мащаб натоварването на оператори е за симетрия, която също има естетическа стойност. Разгледаме следния пример:
#include
клас "точка" клас Point координати на точката
Глобалната ситуация претоварване за вътр + Точка достъп до частни членове чрез специални функции Pointoperator + (инт г, PointZ)
Без глобална задача претоварване вътр + Point не е решен. Тъй като ние не може да получи достъп до "родния" тип цяло число (тоест, да пад) и замени неговите операции, за да се гарантира симетрията на проста дефиниция клас не може да бъде оператори. Той ще вземе решение с глобални функции.
Забележка: Може да се използва приятелски задръстванията, и по този начин да се отървете от "функции за достъп до частни членове." Въпреки това, ако тялото на Point клас ще бъде затворен за нас, пишете на него, друга функция би било нереалистично. въвеждане на данни / изход от претоварване. С цел да се консолидира новата информация, получена от задръстванията, помислете за възможността да се претовари операторите "и". Първо, малко информация -
Извършването на една програма на С ++ започва с набор от предварително определени потоци, които са отворени, обявени за клас обекти в iostream библиотека-файла. Сред тях има две-често се използва обект от нас - е CIN и Cout.
CIN - клас обект istream (стрийминг клас от общ входен цел, което е основа за класа друг вход потоци)
Cout - клас обект ostream (стрийминг клас за общ изход цел, което е основа за класа други изходящите потоци)
Изход в поток се извършва от операция, която е претоварена олевяване операция ". Той е ляв операнд изходящите потоци обект. Дясната операнд може да бъде всяка променлива, за което на изхода се определя в потока. Например изявление Cout «на" Здравей \ н! "; Това води до извода, по предварително определен поток Cout "Hello!" Линия.
За информация вход от потока чрез комин, който е дясната работата на смени е претоварен. " Левият операнд на операцията "е обект на istream.
За да се избегне изненади, IO за абстрактни типове данни трябва да следват същите конвенции, които се използват от операции за вход и изход за вградените типове, а именно:
3. За да позволяват достъп до лични данни на класа, входни и изходни операции да бъдат обявени като приятелски функции класа.
4. В операцията по изход трябва да бъде предадена при постоянна клас референтен обект, тъй като тази операция е да се измени показаните обекти.
По този начин, ние считаме, пример за такова претоварване:
В един пример, ние използвахме постоянен метод - метод, който няма право да промени класа на терена. Все пак, ако някои области е обявен с спецификаторът непостоянен, стойността му може да се промени в метода на вида const.Druzhestvennaya peregruzka.Itak разгледахме приятелски функции и някои примери за тяхното прилагане. Въпреки това, един от основните свойства на тези конкретни функции е, че те могат да бъдат използвани за изпълнение на натоварването на оператори. Този вид претоварване се нарича приятелски.
Нека илюстрираме характеристиките на регистрация на работа функции, както приятелски функции класа.
Резултатът от програмата:
В C ++, но две известен сортове претоварване (претоварване в клас и приятелски претоварване), има и друга идея - глобален претоварване извършват по външния обхват.
Global претоварване - Претоварване е обект, а не начинът, оператор.
Да предположим, че А и В са декларирани като клас С клас С обекти дефинирани оператор C :: оператор + (С), следователно,
Въпреки това, той също така е възможно глобалното претоварване на оператора +:
Такова претоварване изпълнение се отнася и до експресионен А + В, където А и В се предават съответно в първата и втората функция параметър. От тези две предпочитани форми се счита за претоварване в класната стая. Т. к. Втората форма изисква открит призив към членовете на класа, а това оказва негативно влияние върху естетиката на строг капсулиране. Втората форма може да бъде по-удобно да се адаптира класовете, които са в библиотеката, където изходния код не може да се променя и perekompilirovat.To трябва да добавите към претоварване на клас като метод на клас е нереалистично.
Смесете тези две форми на програмата не се препоръчва. Ако операторът идентифицирани две форми на едни и същи видове формални параметри, а след това използвайте оператора може да създаде неяснота, че е вероятно да се окаже фатално.
Независимо от това, в световен мащаб натоварването на оператори е за симетрия, която също има естетическа стойност. Разгледаме следния пример:
Без глобална задача претоварване вътр + Point не е решен. Тъй като ние не може да получи достъп до "родния" тип цяло число (тоест, да пад) и замени неговите операции, за да се гарантира симетрията на проста дефиниция клас не може да бъде оператори. Той ще вземе решение с глобални функции.
Можем да използваме приятелска задръстванията, и по този начин да се отървете от "функции за достъп до частни членове." Въпреки това, ако тялото на Point клас ще бъде затворен за нас, пишете на него, друга функция би било нереалистично.
С цел да се консолидира новата информация, получена от задръстванията, помислете за възможността да се претовари операторите "и". Първо, малко информация - Извършване на всяка програма за C ++ започва с набор от предварително определени потоци, които са отворени, обявени за клас обекти в iostream библиотека-файла. Сред тях има две-често се използва обект от нас - е CIN и Cout.
CIN - клас обект istream (стрийминг клас от общ входен цел, което е основа за класа друг вход потоци) Cout - ostream обект клас (стрийминг клас за изход общо предназначение, което е основа за класа други изходящите потоци)
Изход в поток се извършва от операция, която е претоварена олевяване операция ". Той е ляв операнд изходящите потоци обект. Дясната операнд може да бъде всяка променлива, за което на изхода се определя в потока. Например изявление Cout «на" Здравей \ н! "; Това води до извода, по предварително определен поток Cout "Hello!" Линия.
За информация вход от потока чрез комин, който е дясната работата на смени е претоварен. " Левият операнд на операцията "е обект на istream.
За да се избегне изненади, IO за абстрактни типове данни трябва да следват същите конвенции, които се използват от операции за вход и изход за вградените типове, а именно:
За да се позволи достъп до лични данни на класа, входни и изходни операции да бъдат обявени като приятелски функции класа.
Операцията за изход е необходимо да се предава постоянно позоваване на обект на класа, като тази операция не променя изходните обекти.
По този начин, ние считаме, пример за такова претоварване:
В един пример, ние използвахме постоянен метод - метод, който няма право да промени класа на терена. Все пак, ако някои области е обявен с спецификаторът непостоянен, стойността му може да се промени в метода на Вид строителство.
Това е време, за да разберете какво значи "приятели" може да не е само функция. Класът може да бъде приятелски настроен към друг клас.
Характеристики на "приятелство" между класовете.
Приятелски клас трябва да бъдат дефинирани извън тялото на класа ", предоставяне на приятелства".
Всички компонент клас, други функции ще бъдат приятелски настроени към друг клас без спецификатор приятел.
Всички компоненти на класа на разположение в класа, приятелски, но не и обратното.
Любезен клас може да бъде определена по-късно (нисш) от описания по лесен.