Ответ 124

В 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;


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



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