AOP的核心思想是对横切关注点进行模块化。Aspect C++是针对C++的AOP扩展。
-
join point:运行aspects的代码部分,可以使类、结构、联合、对象、控制流
execution join point与可执行函数名关联。纯虚函数不可执行,因此可执行join point的advice代码不能应用于纯虚函数。但纯虚函数的调用,即这类函数作为call join point,是可以的。
call join point与两个名字相关:源(调用者)名字和调用的目标函数(被调用者)的名字。由于同一个函数中会有很多函数调用,每个函数名可以被关联到一系列的call join point。
construction join point为当创建实例时。destruction join point对应于析构实例。 -
pointcut:是join point的集合。用来定义在什么地方插入advice代码,进行横向切入。类似于C++中的变量,只不过带个括号。定义格式: pointcut 变量名() = 标志符( ||标志符…… )
匹配表达式(name pointcut) "int C::%(...)" 匹配所有类C中返回值为int的成员函数; "%List" 匹配任意以“List”为结尾的类、结构、联合或枚举; "% printf(const char *, ...)" 匹配全局域中名字为print、拥有至少一个const char *型形参、返回任意类型的函数; "const %& ...::%(...)" 匹配所有返回值为const reference的函数; pointcut表达式 "%List" && !derived("Queue") 描述以List结尾、不派生自基类Queue的所有类; call("void draw()"