Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.