В C++ и Java в отличие от Си в одном модуле могут быть несколько функций (методов) с одинаковыми именами, необходимо чтобы различалось количество аргументов и/или их тип. Это называется перегрузкой функций. Различий результатов при совпадении аргументов недостаточно.
Например, на Си для вычисления модуля требуется 2 функции:
int abs(int x) // для целого аргумента
{
if(x>=0)
return x;
else
return –x;
}
float fabs(float x) // для целого аргумента
{
if(x>=0)
return x;
else
return –x;
}
Пример в С++ метод Numbersec 3 варианта в одной программе
class Record
{
public:
void Init(int m,int s);
int Numbersec();
void Numbersec(int *k);
void Numbersec(int &k);
private:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int Record::Numbersec() // результат – через значение функции
{
return min*60+sec;
}
void Record::Numbersec(int *k) // результат через параметр - указатель
{
*k= min*60+sec;
}
void Record::Numbersec(int &k) // результат через параметр - ссылку
{
k= min*60+sec;
}
int main(int argc, char* argv[])
{
Record a;
int k;
a.Init(2,20);
k=5;
k=a.Numbersec(); // вызов 1 функции
k=5;
a.Numbersec(&k); // вызов 2 функции
k=5;
a.Numbersec(k); // вызов 3 функции
|
|
return 0;
}
Аналогично на java можно в класс включить 2 функции с одинаковыми именами и различными аргументами.
class Rezult
{
public int param;
}
public class Record
{
private int min;
private int sec;
public void Numbersec(Rezult k) // результат через параметр
{
k.param=min*60+sec;
return;
}
public int Numbersec() // результат через значение функции
{
return min*60+sec;
}
public void Init(int m, int s)
{
min=m;
sec=s;
}
public static void main (String args[])
{
Record a;
Rezult c= new Rezult(); // вспомогательный класс для получения результата
int z;
a= new Record();
a.Init(2, 4);
c.param=6;
a.Numbersec(c); // вызов 1 функции
z=a.Numbersec(); // вызов 2 функции
System. out. printf("ответ %d %d", c.param,z);
}
}
ответ 124 124
6) Указатель (ссылка) на вызывающий объект this
В классе Record к методу Srednee с двумя аргументами добавим метод Srednee с одним (вторым) аргументом (Перегрузка!). Первым будет вызывающий объект
class Record
{
public:
void Put(int m,int s);
int Getmin();
int Getsec();
Record Srednee(Record a,Record b);
Record Srednee(Record b);
private:
int min;
int sec;
};
void Record::Put(int m,int s)
{
min=m;
sec=s;
}
int Record::Getmin()
{
return min;
}
int Record::Getsec()
{
return sec;
}
Record Record::Srednee(Record a,Record b)
{
Record c;
int k;
c.min=a.min+b.min;
k=a.sec+b.sec;
if(k>=60)
{
c.min++;
k=k-60;
}
c.min=c.min/2;
c.sec=k/2;
return c;
}
Record Record::Srednee(Record b)
{
Record c;
int k;
c.min=this -> min+b.min; // this -> - указатель на объект, который вызовет метод
k=this -> sec+b.sec;
if(k>=60) {
c.min++;
k=k-60;
}
c.min=c.min/2;
c.sec=k/2;
return c;
}
int main(int argc, char* argv[])
{
int m,s,k;
Record x,y,z;
x.Put(4,36); // min=4 sec=36
y.Put(2,4); // min=2 sec=4
z=z.Srednee(x,y); // вызов 1 функции z.min=3 z.sec=20 (x+y) /2
z=x.Srednee(x,y); // вызов 1 функции z.min=3 z.sec=20
z=x.Srednee(y); // вызов 2 функции z.min=3 z.sec=20 (x+y) /2
z=z.Srednee(y); // вызов 2 функции z.min=2 z.sec=12 (z+y) /2
}
Указатель this-> можно не использовать (this->min заменить на min). Поле без объекта методе означает поле вызывающего объекта.
|
|
Пример this (ссылка) на java
public class Record
{
private int min;
private int sec;
public int Numbersec()
{
return min*60+sec;
}
public void Init(int m, int s)
{
min=m;
sec=s;
}
public Record Better(Record a,Record b) // с двумя аргументами
{
int s1,s2;
s1=a.Numbersec();
s2=b.Numbersec();
if (s1<s2)
return a;