10.5 对象数组

和Stock示例一样,用户通常要创建同一个类的多个对象。可以创建独立对象变量,就像本章前面的示例所做的,但创建对象数组将更合适。这似乎是在介绍一个未知领域,但实际上,声明对象数组的方法与声明标准类型数组相同:

Stock mystuff[4]; // 创建一个包含4个Stock对象的数组

前面讲过,当程序创建未被显式初始化的类对象时,总是调用默认构造函数。上述声明要求,这个类要么没有显式地定义任何构造函数(在这种情况下,将使用不执行任何操作的隐式默认构造函数),要么定义了一个显式默认构造函数(就像这个例子那样)。每个元素(mystuff[0]、mystuff[1]等)都是Stock对象,可以使用Stock方法:

mystuff[0].update();     // 调用第一个元素的update()方法
mystuff[3].show();       // 调用第4个元素的show方法
const Stock *tops = mystuff[2].topval(mystuff[1]);
     // 比较第2个和第3个元素,获取有较大的topval值的对象的指针

可以用构造函数来初始化数组元素。在这种情况下,必须为每个元素调用构造函数:

const int STKS = 4;
Stock stocks[STKS] = {
    Stock(“NanoSmart" ,12.5 ,20),
    Stock(“Boffo Object” , 200 ,2.0),
    Stock(“Monolithic Obelisks” ,130 ,3.25),
    Stock(“Fleep Enterprises” , 60 ,.5)
    };

这里的代码使用标准格式对数组进行初始化:用括号括起的、以逗号分隔的值列表。其中,每次构造函数调用表示一个值。如果类包含多个构造函数,则可以对不同元素使用不同的构造函数:

const int STKS = 10;
Stock stocks[STKS]{
    Stock(“NanoSmart” ,12.5 ,20),
    Stock(),
    Stock(“Monolithic Obelisks” ,130 , 3.25),
}

上述代码使用Stock(const string & co,long n,double pr)初始化stock[0]和stock[2],使用构造函数Stock()初始化stock[1]。由于该声明只初始化了数组的部分元素,因此余下的7个元素将使用默认构造函数进行初始化。

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,则这个类必须有默认构造函数。

程序清单10.9在一个小程序中使用了这些原理,该程序对4个数组元素进行初始化,显示它们的内容,并找出这些元素中总值最高的一个。由于topval()每次只检查两个对象,因此程序使用for循环来检查整个数组。另外,它使用stock指针来跟踪值最高的元素。该程序使用程序清单10.7中的头文件和程序清单10.8中的方法文件。

程序清单10.9 usestock2.cpp

// usestok2.cpp -- using the Stock class
// compile with stock20.cpp
#include <iostream>
#include "stock20.h"

const int STKS = 4;
int main()
{
    // 创建已初始化的对象数组
    Stock stocks[STKS] = {
        Stock("NanoSmart", 12, 20.0),
        Stock("Boffo Objects", 200, 2.0),
        Stock("Monolithic Obelisks", 130, 3.25),
        Stock("Fleep Enterprises", 60, 6.5)
        };

    std::cout << "Stock holdings:\n";
    int st;
    for (st = 0; st < STKS; st++)
        stocks[st].show();
	// 将指针指向第一个元素
    const Stock * top = &stocks[0];
    for (st = 1; st < STKS; st++)
        top = &top->topval(stocks[st]);
	// 现在的指针指向价值最高的所持股票
    std::cout << "\nMost valuable holding:\n";
	top->show();
    std::cin.get();
    return 0; 
}

下面是该程序的输出:

Stock holdings:
Company: NanoSmart Shares: 12
  Share Price; $20.000 Total Worth: $240.00
Company: Boffo Objects Shares: 200
 Share Price; $2.000 Total Worth: $400.00
Company: Monolithic Obelisks Shares: 130
  Share Price: $3.250 Total Worth: $422.50
Company: Fleep Enterprises Shares: 60
  Share Price: $6.500  Total Worth: $390.00
Most valuable holding:
Company: Monolithic Obelisks Shares: 130
  Share Price: $3.250 Total Worth: $422.50

有关程序清单10.9,需要注意的一点是,大部分工作是在类设计中完成的。完成类设计后,编写程序的工作本身便相当简单。

顺便说一句,知道this指针就可以更深入了解C++的工作方式。例如,最初的UNIX实现使用C++前端cfront将C++程序转换为C程序。处理方法的定义时,只需将下面这样的C++方法定义:

void Stock::show() const
{
    cout <<" Company: " << company
          <<" Shares:  " << shares << '\n'
          <<"  Share Price:$" << share_val
           <<" Total Worth:  $" << total_val << '\n';
}

转换为下面这样的C-风格定义:

void show(const Stock *this)
{
    cout <<" Company:  " << this->company
          <<" Shares:  " << this->shares << '\n'
          <<"  Share Price:$" << this->share_val
           <<" Total Worth:  $" << this->total_val << '\n';
}

 即将Stock::限定符转换为函数参数(指向Stock的指针),然后用这个指针来访问类成员。同样,该前端将下面的函数调用:

 top.show(); 

转换为:

show(&top); 

这样,将调用对象的地址赋给了this指针(实际情况可能更复杂些)。

文件下载(已下载 467 次)

发布时间:2014/7/9 上午9:10:02  阅读次数:3882

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号