github上的每日学习 11

一、 类的组合

问题1、类的组合是什么呢?

基本概念是类中的成员是另一个类的对象,可以在已有的抽象的基础上实现更复杂的抽象。

问题2、组合类的构造函数怎么定义呢?

参数传递,然后用部件类的构造函数来初始化。

问题3、组合类的构造函数设计

原则:不仅要负责本类中的基本类型成员初始化,也要对对象成员初始化。
声明形式:

类名::类名(对象成员所需的形参,本类成员形参):
对象1(参数),对象2(参数),··········
{
//函数体其他语句
}

问题4、初始顺序

按成员定义的顺序,成员对象也是。

问题5、组合类没有构造函数,怎么办?

这就需要部件类都有默认构造函数。

二、 类组合程序举例

线段类:
经过将近一个小时的修改和理解终于会了!
以下是代码和自己加的注释和理解。

#include<iostream>
using namespace std;
//以下是点类,这个类包括了构造函数,复制构造函数,成员横纵坐标和获取坐标函数。
class Point {
public:
	Point(int X, int Y);
	Point(Point& p);
	int getX() { return x; }
	int getY() { return y; }
private:
	int x, y;
};
//点的构造函数,这是定义一个新点必须的,这也是我忘记定义的一个地方。
Point::Point(int X,int Y)
{
	x = X;
	y = Y;
}
//点的复制构造函数:
Point::Point(Point& p)
{
	x = p.x;
	y = p.y;
	cout << "Calling the copy construct of Point" << endl;
}
//线段类,这里包括了构造函数,复制构造函数,获取长度,和 点类的两个对象,也就是两个端点。
class Line {
public:
	Line(Point xp1, Point xp2);
	Line(Line& l);
	double getLen() { return len; }
private:
	Point p1, p2;
	double len;
};
//组合类的构造函数
Line::Line(Point xp1, Point xp2) :p1(xp1), p2(xp2)
{
	cout << "Calling the copy construct of Line" << endl;
	double x = static_cast<double>(p1.getX() - p2.getX());
	double y = static_cast<double>(p1.getY() - p2.getY());
	len = sqrt(x * x + x * y);
}
//组合类的复制构造函数
Line::Line(Line& l) : p1(l.p1), p2(l.p2)
{
	cout << "Calling the copy construct of Line" << endl;
	len = l.len;

}
//主函数
int main() {
	Point myp1(1, 1), myp2(4, 5);//建立Point类对象
	Line line(myp1, myp2);//建立Line类对象
	Line line2(line);//复制构造成为line2.
	cout << "The length of the line Is:";
	cout << line.getLen() << endl;
	cout << "The lengeh of the line2 is:";
	cout << line2.getLen() << endl;
	return 0;
}

posted @ 2020-02-08 17:54  zouzouy  阅读(110)  评论(0编辑  收藏  举报