您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记六

2015-09-24 21:48 260 查看
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]
的指针变量,若有:

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类型指针数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: