对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义、赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象。
1. 对象数组的定义
对象数组定义格式如下:
<类名><数组名>[<大小>]...
其中,<类名>指出该数组元素是属于该类的对象,方括号内的<大小>给出某一维的元素个数。一维对象数组只有一个方括号,二维对象数组要有两个方括号,等等,例如:
DATE dates[7];
表明dates是一维对象数组名,该数组有7个元素,每个元素都是类DATE的对象。
2. 对象数组的赋值
对象数组可以被赋初值,也可以被赋值。例如:
class DATE
{
public:
DATE(int m, int d, int y);
void printf();
private:
int month, day, year;
};
下面是定义对象数组并赋初值和赋值:
DATE dates[4]={ DATE(7, 7, 2001), DATE(7, 8, 2001), DATE(7, 9, 2001), DATE(7, 10, 2001) }
或者
dates[0] = DATE(7, 7, 2001);
dates[1] = DATE(7, 8, 2001);
dates[2] = DATE(7, 9, 2001);
dates[3] = DATE(7, 10, 2001);
指向数组的指针和指针数组
指向数组的指针和指针数组是两个完全不同的概念,现放在一起介绍是中为两者在定义格式相似,千万不要把它们搞混了。
1. 指向数组的指针
指向一般数组的指针定义格式如下:
<类型说明符>(*<指针名>)[<大小>]...
其中,用来说明指针的 * 要与<指针名>括在一起。后面用一个方括号表示该指针指向一维数组,后面用二个方括号表示该指针指向二维数组。<类型说明符>用来说明指针所指向的数组的元素的类型。例如:
int (*P)[3];
P是一个指向一维数组的指针,该数组有3个int型元素。
而指向对象数组的指针,则把<类型说明符>改为<类名>即可:
<类名>(*<指针名>)[<大小>]...
指向数组的指针的主要应用思想是:将数组的首地址(二维数组的某个行地址)赋给指针,然后通过循环(for)改变指针指向的地址,从而动态的访问数组中各个元素。
2. 指针数组
所谓指针数组指的是数组元素为指针的那类数组。一个数组的元素可以是指向同一类型的一般指针,也可以是指向同一类类型的对象。
一般指针数组的定义格式如下:
<类型名>*<数组名>[<大小>]...
其中,*加在<数组名>前面表示该数组为指针数组。[<大小>]表示某一维的大小,即该维的元素个数,…表示可以是多维指针数组,每一个[<大小>]表示一维。例如:
int * pa[3];
char * pc[2][5];
在C++编程中,经常使用char型的指针数组用来存放若干个字符串。下面是一个一维指针数组的例子。
#include <iostream.h>
#include <string.h>
const int N = 5;
void main()
{
char *strings[N]; //定义一个一维指针数组strings
char str[80];
cout<<"At each prompt, enter a string:\n";
for (int i=0; i<N; i++)
{
cout<<"Enter a string #"<<i<<":";
cin.getline(str, sizeof(str));
strings[i] = new char[strlen(str) + 1];
strcpy(strings[i], str);
}
cout<<endl;
for (i=0; i<N; i++)
cout<<"String #"<<i<<":"<<strings[i]<<endl;
}
对象指针数组的定义如下:
对象指针数组是指该数组的元素是指向对象的指针,它要求所有数组元素都是指向同一个类类型的对象的指针。格式如下:
<类名>*<数组名>[<大小>]...
它与前面讲过的一般的指针数组所不同的地方仅在于该数组一定是指向对象的指针。即指向对象的指针用来作该数组的元素。下面通过一个例子看一下对象指针数组的用法。
#include <iostream.h>
class A
{
public:
A(int i=0, int j=0) { a=i; b=j; }
void print();
private:
int a, b;
};
void A::print()
{
cout<<a<<","<<b<<endl;
}
void main()
{
A a1(7, 8), a2, a3(5, 7);
A *b[3] = { &a3, &a2, &a1 };
for (int i=0; i<3; i++)
b[i]->print();
}
带参数的main()参数
前面讲过的main()函数都是不带参数的。在实际编程中,有时需要main()带参数。通过main()函数的参数给程序增加一些处理信息。一般地说,当使用C++编写的源程序经过编译连接生成的可执行文件在执行时,需要还命令行参数,由该源程序的主函数main()就需要带参数。使用所还有的参数来存放命令行中的参数,以便在程序中对命令行参数进行处理。
带有参数的main()函数头格式如下:
void main(int argc, char * argv[])
其中,第一个参数argc是int型的,它用来存放命令行参数的个数,实际上argc所存放的数值比命令行参数的个数多1,即将命令字(可执行文件名)也计算在内。第二个参数argv是一个一维的一级指针数组,它是用来存放命令行中各个参数和命令字的字符串的,并且规定:
argv[0]存放命令字
argv[1]存放命令行中第一个参数
argv[2]存放命令行中第二个参数
…
这里,argc的值和argv[]各元素的值都是系统自动组赋值的。
在这里讲述带参数的main()函数实际上是对指针数组应用的一个具体实例。
#include <iostream.h>
void main(int argc, char *argv[])
{
cout<<"The number of command line arguments is:"<<argc<<endl;
cout<<"The program name is:"<<argv[0]<<endl;
if (argc>1)
{
cout<<"The command line arguments:\n";
for (int i=1; i<argc; i++)
cout<<argv[i]<<endl;
}
}
上述编译连接后的EXE文件,可在DOS命令行下调试。
关于命令行参数的使用,其基本方法是直接引用指针数组argv[]中某个元素所存放的字符串,可用下标方式,也可用指针方式。
2001-7-7 12:05
附带《C++面向对象基础教程》
文件下载: 点击下载 [114KB],[rar格式,下载 Winrar300sc ]