Перегрузка функций-конструкторов, параметры по умолчанию в конструкторе



Также как и любые другие функции, конструкторы могут перегружаться и иметь значения по умолчанию. Перепишем предыдущий пример, добавив туда перегружаемый конструктор, в который можно передавать значения n и k.

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

class prostr{

public:

prostr(int,int);

prostr();

float poisk_min();

float poisk_max();

int vivod_result();

int delete_a();

private:

int n;

int k;

float **a;

float min;

float max;

int imin;

int jmin;

int imax;

int jmax;

};

void main()

{

prostr x(3,5);

// prostr x;

x.poisk_max();

x.poisk_min();

x.vivod_result();

x.delete_a();

}

prostr::prostr()

{

int i,j;

cout<<"VVedite razmernost prostrantva ";

cin>>k;

cout<<"VVedite kolichestvo tochek ";

cin>>n;

a=new float*[k];

for(i=0;i<k;i++)

a[i]=new float[n];

for(j=0;j<n;j++)

{

cout<<"VVedite koordinati "<<j<<" tochki"<<endl;

for(i=0;i<k;i++)

cin>>a[i][j];

}

}

prostr::prostr(int k1, int n1)

{

int i,j;

k=k1;

n=n1;

a=new float*[k];

for(i=0;i<k;i++)

a[i]=new float[n];

for(j=0;j<n;j++)

{

cout<<"VVedite koordinati "<<j<<" tochki"<<endl;

for(i=0;i<k;i++)

cin>>a[i][j];

}

}

float prostr::poisk_max()

{

int i,j,l;

float s;

for(max=0,l=0;l<k;l++)

max+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

max=pow(max,0.5);

imax=0;jmax=1;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)

s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s>max)

{

max=s;

imax=i;

jmax=j;

}

}

return 0;

}
float prostr::poisk_min()

{
int i,j,l;

float s;

for(min=0,l=0;l<k;l++)

min+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

min=pow(min,0.5);

imin=0;jmin=1;

for(i=0;i<k;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)

s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s<min)

{

min=s;

imin=i;

jmin=j;

}

}

return 0;

}
int prostr::vivod_result()

{
int i,j;

for(i=0;i<k;cout<<endl,i++)

for (j=0;j<n;j++)

cout<<a[i][j]<<"\t";

cout<<"max="<<max<<"\t nomera "<<imax<<"\t"<<jmax<<endl;

cout<<"min="<<min<<"\t nomera "<<imin<<"\t"<<jmin<<endl;

return 0;

}
int prostr::delete_a()

{
delete [] a;

return 0;}

Теперь рассмотрим как можно использовать параметры по умолчанию в конструкторе. Оставим в задаче только конструктор с параметрами (n и k), но сделаем их по умолчанию равными 2 и 10 соответственно.

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

class prostr{

public:
prostr(int k1=2,int n1=10);

//prostr();

float poisk_min();

float poisk_max();

int vivod_result();

int delete_a();

private:
int n;

int k;

float **a;

float min;

float max;

int imin;

int jmin;

int imax;

int jmax;

};

void main()

{

prostr x(2,3);

//prostr x;

prost x;

x.poisk_max();

x.poisk_min();

x.vivod_result();

x.delete_a();

}

prostr::prostr(int k1, int n1)

{ int i,j;

k=k1;

n=n1;

a=new float*[k];

for(i=0;i<k;i++)

a[i]=new float[n];

for(j=0;j<n;j++)

{

cout<<"VVedite koordinati "<<j<<" tochki"<<endl;

for(i=0;i<k;i++)

cin>>a[i][j];

}

}

float prostr::poisk_max()

{

int i,j,l;

float s;

for(max=0,l=0;l<k;l++)

max+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

max=pow(max,0.5);

imax=0;jmax=1;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)

s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s>max)

{

max=s;

imax=i;

jmax=j;

}

}

return 0;

}

float prostr::poisk_min()

{

int i,j,l;

float s;

for(min=0,l=0;l<k;l++)

min+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

min=pow(min,0.5);

imin=0;jmin=1;

for(i=0;i<k;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)

s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s<min)

{

min=s;

imin=i;

jmin=j;

}

}

return 0;

}

int prostr::vivod_result()

{

int i,j;

for(i=0;i<k;cout<<endl,i++)

for (j=0;j<n;j++)

cout<<a[i][j]<<"\t";

cout<<"max="<<max<<"\t nomera "<<imax<<"\t"<<jmax<<endl;

cout<<"min="<<min<<"\t nomera "<<imin<<"\t"<<jmin<<endl;

return 0;

}
int prostr::delete_a()

{
delete [] a;

return 0;

}

Функция-деструктор

С++ позволяет построить функцию-деструктор, которая выполняется при уничтожении экземпляра класса, что происходит в следующих случаях:

1. При завершении программы или выходе из функции.

2. При освобождении памяти, выделенной для экземпляра класса.

Деструктор имеет имя ~имя_класса, не имеет параметров и не может перегружаться. Если деструктор не определен явно, то будет использоваться стандартный деструктор. Допишем в нашу программу деструктор, который будет выводить сообщение об уничтожении объекта.

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

class prostr{

public:
prostr(int k1=2,int n1=10);

~prostr();

//prostr();

float poisk_min();

float poisk_max();

int vivod_result();

int delete_a();

private:
int n;

int k;

float **a;

float min;

float max;

int imin;

int jmin;

int imax;

int jmax;

};
void main()

{
prostr x(2,3);

x.poisk_max();

x.poisk_min();

x.vivod_result();

x.delete_a();

}

prostr::prostr(int k1, int n1)

{
int i,j;

k=k1;

n=n1;

a=new float*[k];

for(i=0;i<k;i++)

a[i]=new float[n];

for(j=0;j<n;j++)

{

cout<<"VVedite koordinati "<<j<<" tochki"<<endl;

for(i=0;i<k;i++)

cin>>a[i][j];

}

}
prostr::~prostr()
{
cout<<"delete object!!!"<<endl;

}
float prostr::poisk_max()

{
int i,j,l; float s;

for(max=0,l=0;l<k;l++)

max+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

max=pow(max,0.5);

imax=0;jmax=1;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)

s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s>max)

{

max=s;

imax=i;

jmax=j;

}

}

return 0;

}
float prostr::poisk_min()

{
int i,j,l;

float s;

for(min=0,l=0;l<k;l++)

min+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);

min=pow(min,0.5);

imin=0;jmin=1;

for(i=0;i<k;i++)

for(j=i+1;j<n;j++)

{

for(s=0,l=0;l<k;l++)


s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);

s=pow(s,0.5);

if (s<min)

{

min=s;

imin=i;

jmin=j;

}

}

return 0;

}
int prostr::vivod_result()

{

int i,j;

for(i=0;i<k;cout<<endl,i++)

for (j=0;j<n;j++)

cout<<a[i][j]<<"\t";

cout<<"max="<<max<<"\t nomera "<<imax<<"\t"<<jmax<<endl;

cout<<"min="<<min<<"\t nomera "<<imin<<"\t"<<jmin<<endl;

return 0;

}

int prostr::delete_a()

{

delete [] a;

return 0;

}

Результат работы программы

VVedite koordinati 0 tochki

2 3

VVedite koordinati 1 tochki

4 5

VVedite koordinati 2 tochki

6 7

2 4 6

3 5 7

max=5.65685 nomera 0 2

min=2.82843 nomera 0 1

delete object!!!

Press any key to continue

Массив объектов класса

Для массива пространств вернемся к конструктору, который определяет значения n и k по вводимым с экрана числам. Ниже приведен пример массива из элементов.

#include "stdafx.h"
#include <iostream.h>
#include <math.h>
class prostr{
public:
prostr();
~prostr();
float poisk_min();
float poisk_max();
int vivod_result();
int delete_a();
private:
int n;
int k;
float **a;
float min;
float max;
int imin;
int jmin;
int imax;
int jmax;
};
void main()
{
int m;
prostr x[3];
for(m=0;m<3;m++)
{
x[m].poisk_max();
x[m].poisk_min();
x[m].vivod_result();
x[m].delete_a();
}
}
prostr::prostr()
{
int i,j;
cout<<"VVedite razmernost prostrantva ";
cin>>k;
cout<<"VVedite kolichestvo tochek ";
cin>>n;
a=new float*[k];
for(i=0;i<k;i++)
a[i]=new float[n];
for(j=0;j<n;j++)
{
cout<<"VVedite koordinati "<<j<<" tochki"<<endl;
for(i=0;i<k;i++)
cin>>a[i][j];
}

}
prostr::~prostr()
{
cout<<"delete object!!!"<<endl;
}
float prostr::poisk_max()
{
int i,j,l;
float s;
for(max=0,l=0;l<k;l++)
max+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);
max=pow(max,0.5);
imax=0;jmax=1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
for(s=0,l=0;l<k;l++)
s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);
s=pow(s,0.5);
if (s>max)
{
max=s;
imax=i;
jmax=j;
}
}
return 0;
}
float prostr::poisk_min()
{
int i,j,l;
float s;
for(min=0,l=0;l<k;l++)
min+=(a[l][0]-a[l][1])*(a[l][0]-a[l][1]);
min=pow(min,0.5);
imin=0;jmin=1;
for(i=0;i<k;i++)
for(j=i+1;j<n;j++)
{
for(s=0,l=0;l<k;l++)
s+=(a[l][i]-a[l][j])*(a[l][i]-a[l][j]);
s=pow(s,0.5);
if (s<min)
{
min=s;
imin=i;
jmin=j;
}
}
return 0;
}
int prostr::vivod_result()
{
int i,j;
for(i=0;i<k;cout<<endl,i++)
for (j=0;j<n;j++)
cout<<a[i][j]<<"\t";
cout<<"max="<<max<<"\t nomera "<<imax<<"\t"<<jmax<<endl;
cout<<"min="<<min<<"\t nomera "<<imin<<"\t"<<jmin<<endl;
return 0;
}
int prostr::delete_a()
{
delete [] a;
return 0;
}

 

Результаты работы программы.


Дата добавления: 2019-09-13; просмотров: 206; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!