C++ 类对象数组

发布时间:2024年01月04日

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

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

执行结果:

文章来源:https://blog.csdn.net/wendyWJGU/article/details/135372751
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。