C++ 类对象数组

        在使用类的过程中,我们经常需要要创建同一个类的多个对象。可以创建独立对象变量,同时也可以创建对象数组。这似乎是在介绍一个未知领域,但实际上,声明对象数组的方法与声明标准类型数组相同:

        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();
}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WendyWJGu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值