C++ 11:对象与对象的关系,类模板


1. 对象与对象的关系

在这里插入图片描述

1.1 依赖关系(使用一个)

1.1.1 定义

  • 用一个带箭头的虚线表示,描述一个对象在运行期间会用到另一个对象的关系;
  • 临时性关系,随着运行时的变化,依赖关系也可能发生变化;
  • 依赖也有方向:单向依赖,双向依赖,保持单向,杜绝双向
    在这里插入图片描述

1.1.2 代码示例

//依赖关系
class Book
{};
class Notebook_computer
{};
class Desktop_computer
{};
class Student
{
public:
	void Study_programming(Book* p) {}
	void Study_programming(Notebook_computer* p) {}
	void Study_programming(Desktop_computer* p) {}
};
int main()
{
	Book book;
	Notebook_computer note;
	Desktop_computer desk;

	Student hxq;
	hxq.Study_programming(&book);
	hxq.Study_programming(&note);
	hxq.Study_programming(&desk);
	return 0;
}

1.2 关联关系(使用一个)

1.2.1 定义

  • 关联关系是用一条直线表示,描述不同类的对象之间的结构关系,是一种静态关系,通常与运行状态无关,一般由常识等因素来决定
  • 一般用来定义对象之间的静态的、天然的结构,所以关联关系是一种“强关联”关系;
  • 关联关系默认不强调方向,表示对象间相互知道;
  • 关联对象通常是以成员属性(对象)或引用的形式实现;
    在这里插入图片描述
    弱关联:无生存期限制
    强关联:引用

1.2.2 代码示例

弱关联

//弱关联:无生存期限制
class Book {};
class Person
{
private:
	Book* pbook;
public:
	Person(Book* p = nullptr) :pbook(p) {}
	~Person() {}

	void SetBook(Book* p)
	{
		pbook = p;
	}
	Book* GetBook()//获取书
	{
		return pbook;
	}
	void Study()
	{
		if (pbook != nullptr)
		{
			cout << "学习" << endl;
		}
		else
		{
			cout << "玩耍" << endl;
		}
	}
};
int main()
{
	Book book;
	Person hxq;
	hxq.SetBook(&book);
	hxq.Study();

	return 0;
}

在这里插入图片描述
强关联

Book& pbook;//强关联:引用

在这里插入图片描述
代码示例关联关系和生存期

#include<iostream>
using namespace std;

class Course
{

};
class Teacher
{
private:
	//成员对象pa和指针cour生存期不同
	Course* pa;
	Course cou;
public:
	Teacher(Course c1) :cou(c1), pa(nullptr)
	{
	}
	~Teacher() {}
	void SetCourse(Course* p)
	{
		pa = p;
	}
};
class Student
{

};
int main()
{
	Course cr1;
	Teacher te(cr1);

	Course cr2;
	te.SetCourse(&cr1);

	te.SetCourse(&cr2);

	return 0;
}

代码图解
在这里插入图片描述

1.2.3 依赖关系和关联关系如何区分?

依赖关系依赖于外部对象,关联关系是一种特殊的依赖关系。

1.3 聚合关系(有一个,整体和部分)

1.3.1 定义

  • 聚合关系用一条带空心菱形箭头的直线表示
  • 聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成。
  • 与组合关系不同的是,整体和部分不是强依赖(生存期依赖),即使整体不存在,部分仍然存在,例如:部门撤销了,人员不会消失,她们依然存在。
    在这里插入图片描述

1.3.2 代码示例

//聚合关系
class Point
{
};
class Circle
{
	Point* p;
	float _radius;
public:
	Circle() {}
};
int main()
{
	//圆对象消亡,点对象不一定消亡
	Point p;
	Circle c;
}

1.4 组合关系(有一个,用……来构成)

1.4.1 定义

  • 组合关系用一条带实心菱形箭头来表示
  • 与聚合关系一样,组合关系同样表示整体由部分构成的语义,比如公司由多个部门构成
  • 但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了,例如,公司不存在了,部门也将不存在了

在这里插入图片描述

1.4.2 代码示例

//组合关系
class Point
{
};
class Circle
{
	Point p;
	float _radius;
public:
	Circle() {}
};
int main()
{
	//圆对象消亡,点对象没有存在意义
	Point p;
	{
		Circle c;
	}
}

1.4.3 聚合关系和组合关系区别?

聚合关系没有生存期控制,组合关系有生存期控制。

1.5 继承关系(是一个,泛化关系)

公有继承代表“是一个”,可满足属性的复用和方法的复用。

1.5.1 定义

  • 泛化关系用一条带空心箭头的表示
  • 类的继承结构表现在UML中为:泛化与现实
  • 泛化关系表现为公有继承非抽象类
    在这里插入图片描述

1.5.2 代码示例

代码示例1
Cat类和Dog类共用static类型

#include<iostream>
using namespace std;

class Animal
{
protected:
	static int num;
};
int Animal::num = 0;
class Cat: public Animal
{
public:
	Cat()
	{
		cout << "create Cat" << ++num << endl;
	}
	~Cat()
	{
		cout << "destroy Cat" << num-- << endl;
	}
};
class Dog : public Animal
{
public:
	Dog()
	{
		cout << "create Dog" << ++num << endl;
	}
	~Dog()
	{
		cout << "destroy Dog" << num-- << endl;
	}
};
int main()
{
	Cat c1, c2;
	Dog d1, d2, d3;

	return 0;
}

运行结果
在这里插入图片描述
代码图解
在这里插入图片描述
代码示例2
使用模类Cat类和Dog类num生成两个类型,可单独创建

#include<iostream>
using namespace std;

template<class T>
class Animal
{
protected:
	static int num;
};
template<class T>
int Animal<T>::num = 0;

class Cat: public Animal<Cat>
{
public:
	Cat()
	{
		cout << "create Cat" << ++num << endl;
	}
	~Cat()
	{
		cout << "destroy Cat" << num-- << endl;
	}
};

class Dog : public Animal<Dog>
{
public:
	Dog()
	{
		cout << "create Dog" << ++num << endl;
	}
	~Dog()
	{
		cout << "destroy Dog" << num-- << endl;
	}
};
int main()
{
	Cat c1, c2;
	Dog d1, d2, d3;

	return 0;
}

运行结果
在这里插入图片描述

代码图解
在这里插入图片描述

在这里插入图片描述
代码示例3

在这里插入代码片

代码图解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 类模板

2.1 模板分类

模板类型分为三类:类型,非类型,其他模板类型

2.2 代码示例

代码示例1

#include<iostream>
using namespace std;


template<class T,size_t N>
class SeqStack
{
	T data[N];
	int top;
public:
	SeqStack() :top(-1) {}
};
int main()
{
	SeqStack<int, 20> ista;
	SeqStack<int, 40> istb;
	ista = istb;
}

代码图解
在这里插入图片描述


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值