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.
Один класс может быть другом другого (автоматической взаимности нет).