6.2 对象数组和对象指针数组
在前面的章节中,我们已经介绍了数组可以作为类的成员。本节将详细讨论对象作为数组元素的情况,以及指向对象数组的指针和指针数组的使用。
6.2.1 对象数组
对象数组是指数组的每个元素都是某个类的对象。对象数组的定义、赋值和引用与普通数组相似,只是元素是同类的若干个对象。
1. 对象数组的定义
对象数组的定义格式如下:
<类名> <数组名>[<大小>];
例如:
DATE dates[7];
这表示 dates
是一个包含7个 DATE
类对象的一维数组。再比如:
DATE dates2[3][5];
2. 对象数组的赋值
对象数组可以被赋初值,也可以在程序运行时动态赋值。以下是一个例子:
class DATE {
public:
DATE(int m, int d, int y) : month(m), day(d), year(y) {}
void print();
private:
int month, day, year;
};
DATE dates[4] = { DATE(7, 22, 1998), DATE(7, 23, 1998), DATE(7, 24, 1998), DATE(7, 25, 1998) };
这段代码定义了一个包含4个 DATE
对象的数组 dates
,并初始化了每个对象。
例子:
#include <iostream>
using namespace std;
class DATE {
public:
DATE() : month(0), day(0), year(0) {
cout << "Default called.\n";
}
DATE(int m, int d, int y) : month(m), day(d), year(y) {
cout << "Constructor called.\n";
}
~DATE() {
cout << "Destructor called.\n";
}
void print() {
cout << "Month=" << month << ", Day=" << day << ", Year=" << year << endl;
}
private:
int month, day, year;
};
int main() {
DATE dates[5] = { DATE(7, 22, 1998), DATE(7, 23, 1998), DATE(11, 20, 2003) };
dates[3] = DATE(7, 25, 1998);
dates[4] = DATE(1, 7, 2003);
for (int i = 0; i < 5; i++) {
dates[i].print();
}
return 0;
}
执行以上程序,输出结果:
Constructor called.
Constructor called.
Constructor called.
Default called.
Default called.
Constructor called.
Month=7, Day=22, Year=1998
Month=7, Day=23, Year=1998
Month=11, Day=20, Year=2003
Month=7, Day=25, Year=1998
Month=1, Day=7, Year=2003
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
该程序展示了对象数组的定义、初始化和输出过程。
6.2.2 指向数组的指针和指针数组
指向数组的指针和指针数组是两个不同的概念。虽然它们在定义格式上相似,但其用途和含义不同。
1. 指向数组的指针
指向一般数组的指针定义格式如下:
<类型说明符>(*<指针名>)[<大小>];
例如:
int (*P)[3];
这表示 P
是一个指向包含3个 int
元素的一维数组的指针。
指向对象数组的指针定义格式如下:
<类名>(*PL)[4];
这表示 PL
是一个指向包含4个 类名
对象的一维数组的指针。
例子:
#include <iostream>
using namespace std;
int main() {
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int (*pa)[3] = a;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << *(*(pa + i) + j) << " ";
}
cout << endl;
}
return 0;
}
这段程序展示了如何使用指向二维数组的指针来访问数组元素。
2. 指针数组
指针数组是数组的每个元素都是指针。它可以是指向同一类型的数据,也可以是指向同一类型对象的指针。
例子:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 5;
int main() {
char* strings[N];
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 (int i = 0; i < N; i++) {
cout << "String #" << i << ": " << strings[i] << endl;
}
// 释放动态分配的内存
for (int i = 0; i < N; i++) {
delete[] strings[i];
}
return 0;
}
该程序展示了如何使用指针数组来存储和显示字符串。
6.2.3 带参数的 main() 函数
在实际编程中,有时需要在 main() 函数中带参数,以处理命令行输入。带参数的 main() 函数头格式如下:
int main(int argc, char* argv[])
其中,argc
表示命令行参数的个数,argv
是存放命令行参数的指针数组。
例子:
#include <iostream>
using namespace std;
int 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;
}
}
return 0;
}
执行这个程序时,如果命令行输入为 test prog1 prog2 prog3 prog4
,输出结果如下:
The number of command line arguments is 5
The program name is test
The command line arguments:
prog1
prog2
prog3
prog4
通过以上内容,我们详细讨论了对象数组、指向数组的指针和指针数组的定义和使用,并介绍了带参数的 main() 函数的基本概念和应用。希望通过这些例子,能够帮助大家更好地理解和应用这些知识点。