КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Дружественные функции
В общем случае только функции класса имеют доступ к закрытым членам этого класса. Однако в С++ существует возможность разрешить доступ к закрытым членам класса функциям, которые не являются членами класса. Для этого достаточно объявить эти функции дружественными по отношению к рассматриваемому классу. Для того чтобы объявить функцию дружественной некоторому классу, нужно в этот класс включить её прототип, перед которым поставить ключевое слово friend. // Пример 14.3. Использование дружественной функции. #include <iostream> using namespace std; class Samp { int x, y; public: Samp(int n, int m){x = n; y = m;} // конструктор friend int fun(Samp ob); // друж. функция, параметр – объект }; int fun (Samp ob){ if(ob.x % ob.y == 0) return 1; else return 0; // прямой доступ к x и y } int main() { Samp ob(10, 5); // создание объекта ob1 if(fun(ob)) cout<<"ob.x kratno ob.y"<<endl; else cout<<"ob.x no kratno ob.y"<<endl; } В данной программе дружественная функция fun() вызывается обычным образом. Так как дружественная функция не является членом того класса, для которого она дружественна, то её нельзя вызвать, используя имя объекта и операции точка (.) или стрелка (->). Дружественная функция – это функция, определённая вне класса, но имеющая доступ ко всем членам класса. Функция может быть дружественной более чем к одному классу. // Пример 14.4. Функция fun() дружественна классу A и классу B. #include <iostream> using namespace std; class B; class A{ // класс A int data; public: A(){data = 3;} friend int fun(A o_a, B o_b); // дружественная функция }; class B{ // класс B int data; public: B(){data = 7;} friend int fun(A o_a, B o_b); }; int fun( A o_a, B o_b){return(o_a.data + o_b.data);} // функция fun() int main(){ A ob_a; B ob_b; cout<<fun(ob_a, ob_b)<<endl; // 10 } Следует обратить внимание на то, что в программе функция fun() определена только один раз, также используется опережающее объявление для класса B в связи с тем, что параметром функции fun() являетяобъект класса B до определения класса. Функция может быть членом одного класса и дружественной другому классу. Рассмотрим пример. // Пример 14.5. Функция fun() член класса A и дружественна классу B. #include <iostream> using namespace std; class B;
class A { int data; public: A(){data = 3;} int fun(B o_b); // функция fun() – член класса A }; class B { int data; public: B(){data = 7;} friend int A::fun(B o_b); // функция fun() – друг класса B }; int A::fun(B o_b){return(data + o_b.data);} int main() { A ob_a; B ob_b; // вызов функции fun() через cout<<ob_a.fun(ob_b)<<endl; // операцию точка и объект класса A } Правила использования дружественных функций: · функция не является членом класса, но имеет доступ ко всем (в том числе и к закрытым) членам класса через объект, объявленный внутри функции или переданный ей в качестве аргумента; · функция вызывается как обычная функция; · прототип функции может быть объявлен как в открытой, так и в закрытой части класса, но она будет всё равно открытой; · функция может быть дружественной более чем к одному классу; · функция может быть членом одного класса и дружественной другому; · дружественной функции указатель this не передаётся. // Пример 14.6. Нахождение суммы двух рациональных дробей. // Использование конструктора, friend -функции. #include <iostream> using namespace std; class Frac { double a; double b; public: Frac(){}; // конструктор по умолчанию Frac(int n, int m); // конструктор с параметром void show(); // функция вывода friend Frac sumFrac(Frac s1, Frac s2); }; Frac::Frac(int n, int m){ // определение конструктора a = n; b = m; } void Frac::show(){ // определение функции show() cout<<a<<"/"<<b<<endl; } Frac sumFrac(Frac s1, Frac s2){ // друж. функция sumFrac() Frac s3; s3.a = (s1.a * s2.b + s1.b * s2.a); s3.b = (s1.b * s2.b); return s3; } int main() { int x, y; cout<<"Vvedi chisl. i znam. for 1 fraction: "; cin>>x>>y; Frac ob1(x, y); ob1.show(); cout<<"Vvedi chisl. i znam. for 2 fraction: "; cin>>x>>y; Frac ob2(x, y); ob2.show(); Frac ob3 = sumFrac(ob1, ob2); cout<<"sum = "; ob3.show(); system("pause"); } Встраиваемые функции – члены класса Язык программирования С++ позволяет задавать функции, которые не вызываются, а встраиваются в программу в месте её вызова. Использование таких функций не связано с механизмом их вызова и возврата из функции, следовательно, работают они гораздо быстрее обычных. Недостатком встраиваемых функций является то, что код программы возрастает. Из-за этого применение встраиваемых функций обычно ограничивается короткими функциями. Любая функция может стать встраиваемой, включая функции-члены класса. Существует два способа создания встраиваемой функции-члена класса. Первый способ состоит в использовании спецификатора inline перед определением функции. Второй способ состоит в записи функции внутри определения класса, если функция достаточно короткая. Наиболее традиционным использованием встраиваемых функций, определяемых внутри класса, является определение конструктора и деструктора.
Дата добавления: 2015-06-25; Просмотров: 508; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |