文章目录
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(¬e);
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;
}
代码图解