На java дружественные функции отсутствуют

Else

Else

return b;

}

public Record Better(Record b) // с одним аргументом

{

int s1,s2;

s1= this. Numbersec();

s2=b.Numbersec();

if (s1<s2)

return this;

return b;

}

public static void main (String args[])

{

Record a,b,c;

int k;

a= new Record();

b= new Record();

c= new Record();

a.Init(2, 4);

b.Init(2, 5);

c=c.Better(a, b); // вызов 1 функции

k=c.Numbersec();

System. out. printf("лучшее число секунд %d ",k);

c=a.Better(a, b); // вызов 1 функции тоже самое c(min=2 sec=4)

c=a.Better(b); // вызов 2 фунции лучший из a,b

k=c.Numbersec();

System. out. printf("лучшее число секунд %d ",k);

}

}

вывод:

лучшее число секунд 124 лучшее число секунд 124

7) Дружественные функции класса

Рассмотрим пример класс Record, добавим метод вычисления числа секунд с учетом штрафных минут (как в биатлоне)

class Record

{

public:

void Init(int m,int s);

int Getmin(); // число минут

int Getsec(); // число секунд
int NumbersecStraf(int n); // n – количество штрафных минут

private:

int min;

int sec;

};

void Record::Init(int m,int s)

{

min=m;

sec=s;

}

int Record::Getmin()

{

return min;

}

int Record::Getsec()

{

return sec;

}

int Record:: NumbersecStraf (int n)

{

int k;

k=(min+n)*60+sec;

return k;

}

int main(int argc, char* argv[])

{

Record z;

int m;

z.Init(2,15); // z.min=2 z.sec=15

m=z. NumbersecStraf (3); // m=5*60+15 = 315

}

Определим NumbersecStraf как свободную функцию, не принадлежащую классу

class Record

{

public:

void Init(int m,int s);

int Getmin(); // число минут

int Getsec(); // число секунд
private:

int min;

int sec;

};

void Record::Init(int m,int s)

{

min=m;

sec=s;

}

int Record::Getmin()

{

return min;

}

int Record::Getsec()

{

return sec;

}

int NumbersecStraf (Record x,int n) // x – объект у которого вычисляются секунды

{

int m,s,k;

m=x.Getmin(); // количество минут правильно Getmin – public

s=x.Getsec(); // число секунд у x

s=x.sec; // обращение к private не из методов Record

k=(m+n)*60+s;

return k;

}

int main(int argc, char* argv[])

{

Record z;

int m;

z.Init(2,15); // z.min=2 z.sec=15

m= NumbersecStraf (z,3); // m=5*60+15 = 315

}

s=x.sec – ошибка из-за попытки доступа к private.

Если функцию (не метод класса) объявить дружественной к некоторому классу, она будет иметь доступ ко всем полям и методам класса (private игнорируется).

class Record

{

public:

void Init(int m,int s);

int Getmin(); // число минут

int Getsec(); // число секунд

friend int NumbersecStraf (Record x,int n); друг класса
private:

int min;

int sec;

};

........................

int NumbersecStraf (Record x,int n) // x – объект у которого вычисляются секунды

{

int m,s,k;

m=x.min; // правильно, friend никаких private

s=x.sec;

k=(m+n)*60+s; // правильно, friend никаких private

return k;

}

int main(int argc, char* argv[])

{

Record z;

int m;

z.Init(2,15); // z.min=2 z.sec=15

m= NumbersecStraf (z,3); // m=5*60+15 = 315

}

Дружественной к классу может быть функция другого класса

class one
{
friend void two::cheat(int z);
};

cheat из класса two имеет полный доступ к one.

Один класс может быть другом другого (автоматической взаимности нет).


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



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