归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
人生就像骑单车,想保持平衡就得往前进!
一起加油!
目录
一、什么是类的组合:
二、类组合中的难点是关于它的构造函数设计问题。
三、例:类的组合,线段类
🔑说明:
四、 总结:
五、共勉:
一、什么是类的组合:
类的组合是指:类中的成员数据是另一个类的对象。通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。
二、类组合中的难点是关于它的构造函数设计问题。
组合类中有其他类的对象作为成员,这些对象成员也称为类的内嵌对象成员。组合类在创建对象时,它的各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本数据类型数据成员进行初始化,又要对内嵌对象成员进行初始化。组合类构造函数定义的一般形式为:
类名::类名(总形参表):内嵌对象1 (形参表),内嵌对象 2(形参表),……
{
类的初始化
}
三、例:类的组合,线段类
#include<iostream>
#include<cmath>
using namespace std;
class Point{private:int x;int y;public:Point(int px,int py):x(px),y(py){cout<<"Point constructor called"<<endl;}~Point(){cout<<"Point destructor called"<<endl;}Point(const Point&p){x=p.x;y=p.y;cout<<"Point copy constructor called"<<endl;}int getx(){return x;} int gety(){return y;}
};class Line{private:Point p1,p2;double len;public:Line(Point &xp1,Point &xp2);~Line(){cout<<"Line destructor called"<<endl;}double getlen(){return len;}
};Line::Line(Point &xp1,Point &xp2):p1(xp1),p2(xp2){double x=p1.getx()-p2.getx();double y=p1.gety()-p2.gety();len=sqrt(x*x+y*y); cout<<"Line constructor called"<<endl;
}int main(){Point a(3,4),b(10,9);Line ab(a,b);cout<<"a start point"<<"("<<a.getx()<<","<<a.gety()<<")"<<endl;cout<<"b start point"<<"("<<b.getx()<<","<<b.gety()<<")"<<endl;cout<<"The length of the ab is:"<<ab.getlen()<<endl;return 0;
}
🔑说明:
在程序运行后,先调用 Point 类的构造函数两次,构造 Point 类对象a和b; 然后构造 Line 对象L1,在执行 Line 类的构造函数之前,先调用内嵌对象的构造函数,由于内嵌对象是用已有的 Point 对象进行初始化的,所以调用了两次复制构造函数来完成内嵌对象的初始化;接下来执行组合类 Line 的构造函数体;最后输出相关信息
程序运行到最后就开始析构对象,先析构 Line 对象。在析构组合类对象时,析构函数的执行顺序正好与构造函数相反。所以先执行Line 类的析构函数,然后执行内嵌对象的析构函数,最后析构主函数中的两个 Point 类对象a和b。
四、 总结:
- 类中的成员数据是另一个类的对象。
- 通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。
- 组合类中有其他类的对象作为成员,这些对象成员也称为类的内嵌对象成员
- 在创建对象时既要对本类的基本数据类型数据成员进行初始化,又要对内嵌对象成员进行初始化。
五、共勉:
以上就是我对C++类和对象——(8)类的组合的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对类和对象的理解,请持续关注我哦!!!