Void Two::ShowValues(void)

{

cout<<"\n before oneobject.x="<<oneobject.x;

aone.doublex();

cout<<"\n after oneobject.x="<<oneobject.x<<"\n";;

}

Main()

{Two twoobject;

twoobject.ShowValues();

return 0;}

Як бачимо, функція ShowValues класу Two має доступ до поля x об'єкта oneobject і функції doublex(), незважаючи на те, що вони є закритими членами класу One.

Дружні функції

Крім дружніх класів, у С++ існують дружні функції. Синтаксично для оголошення дружньої до класу функції необхідно в протоколі класу помістити оголошення вигляду

friend<тип результату><ім’я функції>(сигнатура);

Зазвичай таке оголошення розміщують одразу після відкриваючої фігурної дужки у протоколі класу. Оголошення функції другом класу відкриває їй доступ до закритих і захищених даних екземпляра класу. Дружні функції можуть бути як звичайними функціями С++, так і членами класу. Зазвичай дружня функція оголошується з параметрами-класами, з якими вона дружить. Розглянемо приклад:

#include <iostream.h>

class Two;

class One{

friend void Show(One &c1,Two &c2);

private:

char*s1;

public:

One(){s1="testing";};

class Two{

friend void Show (One &c1,Two &c2);

private:

char*s2;

public:

Two(){s2="one,two,three";};

Main()

{One c1;

Two c2;

Show(c1,c2);

return 0;}

void Show(One &c1,Two &c2)

{cout<<c1.s1<<c2.s2<<"\n";}

У цьому прикладі оголошується дружня функція до класів One та Two. Це дає їй можливість мати доступ до закритих полів s1 та s2. Тут необхідне неповне оголошення класу Two.

Дружня функція також може бути членом класу. Синтаксично оголошення її реалізується з використанням операції розширення області видимості:

friend<тип результату><ім’я класу>::<ім’я функції-члена>(сигнатура);

Розглянемо приклад:

#include <iostream.h>

class One;

class Two{

friend void Show (One &c1,Two &c2);

private:

char*s2;

public:

Two(){s2="one,two,three";}

void Show(One &c1);

};

class One {

friend void Two::Show(One &c1);

private:

char*s1;

public:

One(){s1="testing";}

};

Main()

{

One c1;

Two c2;

c2.Show(c1);

return 0;}

void Two::Show(One &c1)

{cout<<c1.s1<<"\n";}

Бачимо, що порядок оголошень класів змінився (порівняно з попереднім прикладом), оскільки клас, який містить прототип функції-члена, має оголошуватись раніше класу, який визначає функцію-член дружньою.

Перевантаження операцій

Загальний підхід

У С++ допускається перевантаження операцій. Така можливість надається при роботі з класами. Для перевантаження операцій використовується ключове слово operator. Щоб перевантажити операцію, необхiдно описати функцiю вигляду

<mun>operator<знак операцiї>(параметри).

Перевантажувати можна всi операцiї, крім "*", "::"," sizeof" та ".".

Існує два основних способи визначення перевантажених операцій:

1. Перевантажені операції оголошуються як функції, дружні до класу.

2. Перевантажені операції є членами класу.

Наприклад:

class complex{

public:

double re,im;

complex(){}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: