20、对象数组
#include<iostream.h>
class DATE{
public:
DATE()
{
month=day=year=0;
cout<<"Default constructor called."<<endl;
}
DATE(int m,int d,int y)
{
month = m;
day = d;
year = y;
cout<<"constructor called by yourself."<<endl;
}
~DATE()
{
cout<<"Destructor called."<<endl;
}
void Print()
{
cout<<"Month = "<<month<<",Day = "<<day<<",Year = "<<year<<endl;
}
private:
int month,day,year;
};
void main()
{
int i = 0;
DATE dates[5] = {DATE(7,22,1998),DATE(7,23,1999),DATE(7,24,2000)};
dates[3] = DATE(7,25,2001); //在此处有个匿名对象 输出constructor called by yourself.
// Destructor called
dates[4] = DATE(7,26,2002); //在此处有个匿名对象
for(i = 0;i < 5;i++)
dates[i].Print();
}
总结:a.在直接使用DATE类的构造函数,并没有生成对象也是允许的。而且还可以进行赋值。
22、二维数组重点知识补充:
下面讨论二维数组元素和指针之间的对应关系,清楚二者之间的关系,就能对二维数组进行处理:
设p是指向二维数组a[M][N]的指针变量,若有:
p=a[0];则p+j指向第0行的第j个元素,即a[0]数组的第j个元素。
由于二维数组a[0]...a[M-1]等各个行数一次连续存储,则对于a数组中的任意一个a[i][j]可以表
示为:
*(a+i*N+j)
a[i*N+j]
例如:有如下定义:
int a[3][4] = {{10,20,30,40},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别是a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含1个元素,如
a[1]的4个元素是a[1][0]、a[1][1]、a[1][2]。
若有:
int *p = a[0];(注意a[0]+j则表示换到了第j行)
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]可以表示为*(p+1*N+2)或p[1*N+2]
注意:a.上述的都是将a[0],赋给p,而不是a,一定要知道!!!
b.对于上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。
a[0]是一维数组的名字,它指向的是【一维数组】a[0]的首元素a[0][0],对其进行"*"
运算,得到的是一维数组元素a[0][0]的值,即*a[0]和a[0][0]是同一个值。
a是一个二维数组的名字,它指向的是【二维数组】首元素a[0],对a进行"*"运算,得
到的是一维数组a[0]的首地址,即*a与a[0]是同一个值,它的指针移动单位是行,所以【a+i
指向的是第i行数组,即指向a[i]】。
**************************************************************************************
***【总结:a.a[0]+i是指向第i行的首元素,而a+i是指向a[i]地址,而不是第i行的首元素】 ***
*** b.当用int *p定义指针p时,p的指向是一个int型数据,而不是一个地址,因此***
*** 用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点务必记住。 ***
**************************************************************************************
定义实例:
int a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int (*s)[4]; //表明s指向一个n*4的数组
s=a;
21、指向数组的指针 (42_指向数组的指针和指针数组.cpp)
<类型说明符> (*<指针名>)[<大小>].....
例如:
int (*p)[3];
DATE (*pl)[4]; //后面数字是一维数组的长度。
#include<iostream.h>
class M
{
public:
M() { a=b=0; }
M(int i,int j) { a = i,b = j;}
void Print() { cout<<a<<","<<b<<endl; }
private:
int a,b;
};
void main()
{
M m[2][4];
int x = 10,y = 10;
for(int i = 0;i < 2;i++)
for(int j = 0;j < 4;j++)
m[i][j] = M(x+=2,y+=10);
M(*pm)[4](m); //指向对象数组的指针(指向数组的指针)
cout<<i<<endl;
//cout<<j<<endl; 这个时候j已经被释放掉了
for(i = 0;i < 2;i++)
{
cout<<endl;
for(int j = 0;j < 4;j++)
(*(*(pm+i)+j)).Print();
}
cout<<endl;
}
总结:a.对于该程序,最重要的是要注意其中定义一个指向二维对象数组的指针的方式:M (*pm)[4](m)
注意后面的(m)不能省略,否则出错。
b.另外注意for循环中j变量的生存周期,在二层嵌套中的内层变量在for循环后就释放掉。后面要
重新定义
22、指向对象的指针数组
#include<iostream.h>
class M
{
public:
M(int i=0,int j=0) { a = i;b = j; }
void Print() { cout<<a<<","<<b<<endl; }
private:
int a,b;
};
void main()
{
M a1(1,2),a2(3,4),a3(5,6);
M *b[3] = {&a1,&a2,&a3}; //定义了一个M类型指针数组
(*b[0]).Print();
(*b[1]).Print();
(*b[2]).Print();
}
总结:注意M类型指针数组
#include<iostream.h>
class DATE{
public:
DATE()
{
month=day=year=0;
cout<<"Default constructor called."<<endl;
}
DATE(int m,int d,int y)
{
month = m;
day = d;
year = y;
cout<<"constructor called by yourself."<<endl;
}
~DATE()
{
cout<<"Destructor called."<<endl;
}
void Print()
{
cout<<"Month = "<<month<<",Day = "<<day<<",Year = "<<year<<endl;
}
private:
int month,day,year;
};
void main()
{
int i = 0;
DATE dates[5] = {DATE(7,22,1998),DATE(7,23,1999),DATE(7,24,2000)};
dates[3] = DATE(7,25,2001); //在此处有个匿名对象 输出constructor called by yourself.
// Destructor called
dates[4] = DATE(7,26,2002); //在此处有个匿名对象
for(i = 0;i < 5;i++)
dates[i].Print();
}
总结:a.在直接使用DATE类的构造函数,并没有生成对象也是允许的。而且还可以进行赋值。
22、二维数组重点知识补充:
下面讨论二维数组元素和指针之间的对应关系,清楚二者之间的关系,就能对二维数组进行处理:
设p是指向二维数组a[M][N]的指针变量,若有:
p=a[0];则p+j指向第0行的第j个元素,即a[0]数组的第j个元素。
由于二维数组a[0]...a[M-1]等各个行数一次连续存储,则对于a数组中的任意一个a[i][j]可以表
示为:
*(a+i*N+j)
a[i*N+j]
例如:有如下定义:
int a[3][4] = {{10,20,30,40},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别是a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含1个元素,如
a[1]的4个元素是a[1][0]、a[1][1]、a[1][2]。
若有:
int *p = a[0];(注意a[0]+j则表示换到了第j行)
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]可以表示为*(p+1*N+2)或p[1*N+2]
注意:a.上述的都是将a[0],赋给p,而不是a,一定要知道!!!
b.对于上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同。
a[0]是一维数组的名字,它指向的是【一维数组】a[0]的首元素a[0][0],对其进行"*"
运算,得到的是一维数组元素a[0][0]的值,即*a[0]和a[0][0]是同一个值。
a是一个二维数组的名字,它指向的是【二维数组】首元素a[0],对a进行"*"运算,得
到的是一维数组a[0]的首地址,即*a与a[0]是同一个值,它的指针移动单位是行,所以【a+i
指向的是第i行数组,即指向a[i]】。
**************************************************************************************
***【总结:a.a[0]+i是指向第i行的首元素,而a+i是指向a[i]地址,而不是第i行的首元素】 ***
*** b.当用int *p定义指针p时,p的指向是一个int型数据,而不是一个地址,因此***
*** 用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点务必记住。 ***
**************************************************************************************
定义实例:
int a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int (*s)[4]; //表明s指向一个n*4的数组
s=a;
21、指向数组的指针 (42_指向数组的指针和指针数组.cpp)
<类型说明符> (*<指针名>)[<大小>].....
例如:
int (*p)[3];
DATE (*pl)[4]; //后面数字是一维数组的长度。
#include<iostream.h>
class M
{
public:
M() { a=b=0; }
M(int i,int j) { a = i,b = j;}
void Print() { cout<<a<<","<<b<<endl; }
private:
int a,b;
};
void main()
{
M m[2][4];
int x = 10,y = 10;
for(int i = 0;i < 2;i++)
for(int j = 0;j < 4;j++)
m[i][j] = M(x+=2,y+=10);
M(*pm)[4](m); //指向对象数组的指针(指向数组的指针)
cout<<i<<endl;
//cout<<j<<endl; 这个时候j已经被释放掉了
for(i = 0;i < 2;i++)
{
cout<<endl;
for(int j = 0;j < 4;j++)
(*(*(pm+i)+j)).Print();
}
cout<<endl;
}
总结:a.对于该程序,最重要的是要注意其中定义一个指向二维对象数组的指针的方式:M (*pm)[4](m)
注意后面的(m)不能省略,否则出错。
b.另外注意for循环中j变量的生存周期,在二层嵌套中的内层变量在for循环后就释放掉。后面要
重新定义
22、指向对象的指针数组
#include<iostream.h>
class M
{
public:
M(int i=0,int j=0) { a = i;b = j; }
void Print() { cout<<a<<","<<b<<endl; }
private:
int a,b;
};
void main()
{
M a1(1,2),a2(3,4),a3(5,6);
M *b[3] = {&a1,&a2,&a3}; //定义了一个M类型指针数组
(*b[0]).Print();
(*b[1]).Print();
(*b[2]).Print();
}
总结:注意M类型指针数组