类的组合(基础知识回顾)

类的组合——在一个类里内嵌了其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。

如果在一个类中内嵌了其他类的对象,那么创建这个类的对象时,其中的内嵌对象也会被自动创建。因为内嵌对象是组合类的对象的一部分,所以在构造组合类的对象时不但要对基本数据类型的成员进行初始化,还要对内嵌对象成员进行初始化。

       组合类构造函数定义的一般形式为:

       类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...
       {
                 类的初始化
       }

比如,Point::Point(int xx, int yy):X(xx),Y(yy) { },这个定义应该怎么理解呢?就是我们在构造Point类的对象时传入实参初始化xx和yy,然后用xx的值初始化Point类的数据成员X,用yy的值初始化数据成员Y。

这些构造函数的调用是什么顺序呢?首先,根据前面说的初始化列表,按照内嵌对象在组合类的声明中出现的次序,依次调用内嵌对象的构造函数,然后再执行本类的构造函数的函数体。

例如:

#include <iostream>
using namespace std;

class Point
{
 public:
    Point(int xx,int yy){ X=xx; Y=yy; } //构造函数
    Point(Point &p);
    int GetX(void){ return X; } //取X坐标
    int GetY(void){ return Y; } //取Y坐标
  private:
    int X,Y; //点的坐标
 };

 Point::Point(Point &p)
 {
    X = p.X;
    Y = p.Y;
    cout << "Point拷贝构造函数被调用" << endl;
 }

 class Distance
{
 public:
    Distance(Point a,Point b); //构造函数
    double GetDis()   { return dist; }
 private:
    Point  p1,p2;
    double dist;               // 距离
 };
// 组合类的构造函数
Distance::Distance(Point a, Point b):p1(a),p2(b)
{
   cout << "Distance构造函数被调用" << endl;
   double x = double(p1.GetX() - p2.GetX());
   double y = double(p1.GetY() - p2.GetY());
   dist = sqrt(x*x + y*y);
   return;
}

 int main()
{
    Point myp1(1,1), myp2(4,5);
    Distance myd(myp1, myp2);
    cout << "The distance is:";
    cout << myd.GetDis() << endl;
    return 0;
}

输出结果为:

       Point拷贝构造函数被调用
       Point拷贝构造函数被调用
       Point拷贝构造函数被调用
       Point拷贝构造函数被调用
       Distance构造函数被调用
       The distance is:5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值