有时将一个类的对象嵌套在另一个类中是很有用的。例如,来看以下声明:
class Rectangle
{
private:
double length;
double width;
public:
void setLength(double);
void setWidth(double);
double getLength();
double getWidth();
double getArea();
};
class Carpet
{
private:
double pricePerSqYd;
Rectangle size; // size 是 Rectangle 类的实例
public:
void setPricePerYd(double p);
void setDimensions(double l, double w);
double getTotalPrice();
};
请注意,Carpet 类有一个名为 size 的成员变量,它是 Rectangle 类的一个实例。Carpet 类可以使用此对象来存储房间尺寸并计算购买地毯的面积。图 1 说明了两个类是如何相关的。当一个类被嵌套在另一个类中时,称为对象组合。
下面的程序使用了这两个类来创建计算地毯销售价格:
#include <iostream>
using namespace std;
class Rectangle
{
private:
double length;
double width;
public:
void setLength(double len)
{
length = len;
}
void setWidth(double wid)
{
width = wid;
}
double getLength()
{
return length;
}
double getWidth()
{
return width;
}
double getArea()
{
return length * width;
}
};
class Carpet
{
private:
double pricePerSqYd;
Rectangle size;
public:
void setPricePerYd(double p)
{
pricePerSqYd = p;
}
void setDimensions(double len, double wid)
{
size.setLength(len/3); // Convert feet to yards
size.setWidth (wid/3);
}
double getTotalPrice()
{
return (size.getArea() * pricePerSqYd);
}
};
int main()
{
Carpet purchase;
double pricePerYd;
double length;
double width;
cout << "Room length in feet: ";
cin >> length;
cout << "Room width in feet : ";
cin >> width;
cout << "Carpet price per sq.yard: ";
cin >> pricePerYd;
purchase.setDimensions(length, width);
purchase.setPricePerYd(pricePerYd);
cout << "\nThe total price of my new " << length << " x " << width << " carpet is $" << purchase.getTotalPrice() << endl;
return 0;
}
程序运行结果:
此程序中,其中的客户程序定义了一个名为 purchase 的 Carpet 对象,只使用它来调用 Carpet 类函数,而不是 Rectangle 类函数。它甚至不知道 Carpet 类里面有一个 Rectangle 对象。
另外值得注意的是,在第 43、44 和 48 行中,Carpet 类函数如何调用 Rectangle 函数。正如用户程序通过 Carpet 对象的名称调用 Carpet 函数一样,Carpet 类函数必须通过其 Rectangle 对象的名称调用 Rectangle 函数。在第 35 行中定义的 Rectangle 对象被命名为 size,这就是为什么 Carpet 函数使用以下语句来调用它: