C++学习笔记六

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类型指针数组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值