????????在使用类的过程中,我们经常需要要创建同一个类的多个对象。可以创建独立对象变量,同时也可以创建对象数组。这似乎是在介绍一个未知领域,但实际上,声明对象数组的方法与声明标准类型数组相同:
?? ??? ?Stock stocks[5]; // 创建一个Stock对象的数组
????????当程序创建未被显式初始化的类对象时,总是调用默认构造函数。上述声明要求,这个类要么没有显式地定义任何构造函数(在这种情况下,将使用不执行任何操作的隐式默认构造函数),要么定义了一个显式默认构造函数(就像这个例子那样)。每个元素(stocks[0]、stocks[1]等)都是 Stock 对象可以使用 Stock 方法:
?? ??? ?stocks[0].SetTotal(0) ;// 设置第一个元素
?? ??? ?stocks[3].show() ; ? ? // 显示所有元素
?? ??? ?// 比较第第2个和第3个元素,并返回更高的对象的引用
?? ??? ?const Stock* tops = stocks(2).topval(stocks[1]); ?
????????可以用构造函数来初始化数组元素。在这种情况下,必须为每个元素调用构造函数:
?? ?const int NUM = 5;
?? ?Stock stocks[NUM] = {
?? ??? ?Stock(11.11, 11.22),
?? ??? ?Stock(21.11, 21.22),
?? ??? ?Stock(31.11, 31.22),
?? ??? ?Stock(41.11, 41.22),
?? ??? ?Stock(51.11, 51.22),
?? ?}
?? ?
????????这里的代码使用标准格式对数组进行初始化:用括号括起的、以逗号分隔的值列表。其中,每次构造函数调用表示一个值。如果类包含多个构造函数,则可以对不同的元素使用不同的构造函数。
????????初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数。
下面的示例程序该程序对5个数组元素进行初始化,显示它们的内容,并找出这些元素中总值最高的一个。由于 topal()每次只检查两个对象,因此程序使用 for 循环来检查整个数组。另外它使用 stock 指针来跟踪值最高的元素。
示例源码:
// Len2024_0104_01.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
class Stock
{
private:
double total_val;
double single_val;
public:
Stock(); // 默认构造函数
Stock(double single, double total); // 自定义构造函数
~Stock() {} // 析构函数
public:
void SetTotal(double total) { total_val = total; } // 设置total_val的值
double GetTotal() const { return total_val; } // 获取total_val的值
public:
void Show() const;
const Stock & topval(const Stock & s) const; // 返回比较后较大的stock对象的引用
};
// 默认构造函数
Stock::Stock()
{
total_val = 0;
single_val = 0;
}
// 自定义构造函数
Stock::Stock(double single, double total)
{
single_val = single;
total_val = total;
}
// 函数实现 - 返回比较后较大的stock对象的引用
const Stock & Stock::topval(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
void Stock::Show() const
{
printf("single_val = %f, ", single_val);
printf("total_val = %f\n", total_val);
}
int main()
{
printf("第一种用法,默认构造函数: \n");
const int NUM = 5;
Stock stocks[NUM];
stocks[0].SetTotal(10.1);
stocks[1].SetTotal(20.1);
stocks[2].SetTotal(30.1);
stocks[3].SetTotal(4.1);
stocks[4].SetTotal(5.1);
const Stock* tops = &stocks[1].topval(stocks[0]);
for (int i = 1; i < 5; i++)
{
tops = &tops->topval(stocks[i]);
}
stocks[0].Show();
stocks[1].Show();
stocks[2].Show();
stocks[3].Show();
stocks[4].Show();
printf("其中最大值是: ");
tops->Show();
printf("\n第2种用法,自定义构造函数初始化: \n");
// 使用自定义数组初始化对象数组
Stock myStocks[NUM] = {
Stock(10.1, 10.1),
Stock(20.1, 20.1),
Stock(30.1, 30.1),
Stock(4.1, 4.1),
Stock(5.1, 5.1)
};
const Stock* myTops = &myStocks[1].topval(myStocks[0]);
for (int i = 1; i < 5; i++)
{
myTops = &myTops->topval(myStocks[i]);
}
myStocks[0].Show();
myStocks[1].Show();
myStocks[2].Show();
myStocks[3].Show();
myStocks[4].Show();
printf("其中最大值是: ");
myTops->Show();
}
执行结果: