6.2 对象数组和对象指针数组

 

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() 函数的基本概念和应用。希望通过这些例子,能够帮助大家更好地理解和应用这些知识点。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值