Перегрузка функций-конструкторов, параметры по умолчанию в конструкторе
Также как и любые другие функции, конструкторы могут перегружаться и иметь значения по умолчанию. Перепишем предыдущий пример, добавив туда перегружаемый конструктор, в который можно передавать значения 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!