类的组合

类的组合

示例代码
`
include
include
using namespace std;

class Point{
private:
int x,y;
public:
Point(int px,int py)
{
x=px;
y=py;
cout<<"Point constructor called"<<endl; //调用的点构造函数
}
Point(const Point& p)
{
x=p.x;
y=p.y;
cout<<"Point copy constructor called"<<endl; //调用的点复制构造函数
}
~Point() { cout<<"Point destructor called"<<endl; }
int getx() { return x; }
int gety() { return y; }
};

class Line{
private:
//这里体现了类的组合:即Line类中的数据成员是另一个Point类的对象。
//通过类的组合在已有的点抽象的基础上实现了更复杂的线段抽象。
Point p1,p2; //定义了点对象p1,p2为它的私有数据成员,得以访问点对象中的成员
double len;
public:
//线段需要两个点构成,传入点对象xp1,xp2。并将它们保存到线段类的数据成员中
Line(const Point& xp1,const Point& xp2); //线段复制构造函数
~Line() { cout<<"Line destructor called"<<endl; }
double getLen() {return len;}
};

Line::Line(const Point& xp1,const Point& xp2):p1(xp1),p2(xp2)//这里就是内嵌初始化定义,内嵌的xp1初始化p1,xp2初始化p2
{
double x=p1.getx()-p2.getx();
double y=p1.gety()-p2.gety();
len=sqrt(xx+yy);
cout<<"Line constructor called"<<endl; //调用的线段复制构造函数
}

int main()
{
Point pa(3,4),pb(10,9);
Line L1(pa,pb);
cout<<"L1 start point:"<<"("<<pa.getx()<<","<<pa.gety()<<")"<<endl;
cout<<"L1 end point:"<<"("<<pb.getx()<<","<<pb.gety()<<")"<<endl;
cout<<"The length of L1 is:"<<L1.getLen()<<endl;
return 0;
}
`
教材定义:
类的组合是指:类中的成员数据是另一个类的对象。
通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。
例如:在定义了点类(Point)以后,我们希望通过两个点定义一点线段,甚至还希望通过三个点定义一个三角形,或四边形等等。
类组合中的难点是关于它的构造函数设计问题。组合类中有其他类的对象作为成员,这些对象成员也成为类的内嵌对象成员。
组合类在创建对象时,它的各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本数据类型数据成员进行初始化,又要对内嵌对象成员进行初始化。
组合类构造函数定义的一般形式为:
类名::类名(总形参表):内嵌对象1(形参表),内嵌对象2(形参表),… { 类的初始化 }

个人理解:
C++中,类的组合(Composition)是一种对象关系,表示一个类对象包含另一个类对象作为其成员变量。这种关系是一种强耦合关系,被认为是一种"has-a"的关系,即一个对象"has-a"另一个对象。通俗的说,组合就是一个类对象包含了其他类对象,并且这些成员对象的生命周期与其所在的类对象的生命周期是一致的。
组合关系的体现在代码层面上,就是在一个类中定义另一个类的对象作为其成员变量,并在该类的构造函数中进行初始化。例如下面这段代码:
class Car { private: Engine engine; // Engine作为Car的成员变量 public: Car() : engine() {} // Car的构造函数中初始化engine };
在这个例子中,Car类包含一个Engine对象作为其成员变量。当Car对象被创建时,其成员变量engine也会被创建并初始化。由于组合关系的生命周期一致,当Car对象被销毁时,其成员变量engine也会自动被销毁。
总之,组合是一种强耦合的关系,适用于在一个类中包含另一个类对象的场景,可以方便地管理对象的生命周期和数据。
就像下面这样,类的组合
image

B站有清华大学教程,很猛,但是,她的Windows没激活,诶嘿。

posted @ 2023-03-15 22:43  Xuuio  阅读(25)  评论(1编辑  收藏  举报