目录
1.依赖关系:
是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;
举例:学生学习可以通过书,台式电脑,笔记本,还可以冥想式学习;
//依赖关系
class Book{};
class Deskcomputer{};//台式机
class Notecomputer {};//笔记本
class student //学生
{
public:
void study_process(Book* pbook = nullptr);
void study_process(Deskcomputer* pc = nullptr);
void study_process(Notecomputer* pn = nullptr);
};int main()
{
book cpp,java;
Deskcomputer pc;
Notecomputer nc;
student john;
john.study_process(); //冥想
john.study_process(&cpp); //boook(cpp)
john.study_process(&java); //book(java)
john.study_process(&&pc); //台式机
john.study_process(&nc); //笔记本
return 0;
}
2.关联关系
描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行 状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构;
有两种关联关系:弱关联和强关联
举例:教师和课程之间就是一种关联关系;学生和学校就是一种关联关系;
//弱关联关系 : 使用指针
class Course{};
class Teacher
{
private:
Course* p; //弱关联,可以改变指向
public:
Teacher(Course *pcourse=nullptr):p{pcourse}{}void setCourse(Course *pcourse=nullptr)
{
p = pcourse;
}
};int main()
{
Course cpp,java,python;
Teacher chen(&cpp); //教c++
chen.setCourse(&python); //教python
chen.setCourse(); //退休后,不教书
return 0;
}
强关联关系: 对象间一旦建立关系不可再次更换对象
class Course {};
class Teacher
{
private:
Course& p; //强关联 ,一旦建立不可改变指向
//不存在空引用,构造函数必须有参数
public:
//Teacher(Course pcourse) :p{ pcourse } {} error
//形参为局部变量,生命周期结束后被析构掉
Teacher(Course& pcourse) :p{ pcourse } {}
void setCourse(Course& s)
{
p = s; //按位进行赋值,并非改变指向
}
};
3.聚合关系
聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成; 即使整体不存在了,部分仍然存在(例 如, 部门撤销了,人员不会消失,他们依然存在)
举例:点和圆
class point
{
private:
float x;
float y;
public:
point(float a=0.0,float b=0.0):x{a},y{b}{}
point(const point& s) = default; //采用系统默认
};
class circle
{
private:
point _center{ 0,0 };
float radu = 1;
static const float pi;
public:
circle(){}
};
const float circle::pi = 3.14;
int main()
{
circle s;
point a;//点可以脱离圆单独存在
}
4.组合关系
与聚合关系不同的是,整体和部分是强依赖(生存期控制),部分和整体是同生共死。
class point
{
private:
float x;
float y;
public:
point(float a=0.0,float b=0.0):x{a},y{b}{}
point(const point& s) = default; //采用系统默认
};
class circle
{
private:
point _center{ 0,0 };
float radu = 1;
static const float pi;
public:
circle(){}
};
const float circle::pi = 3.14;
int main()
{
circle s; //当程序结束结束后,圆心会随着圆一起死亡
}
需要注意:聚合关系和组合关系只是语义上有区别,代码上没有区别