当一个Query类型的对象被拷贝、移动、赋值或销毁时,将分别发生什么?
-- 拷贝:当Query对象被拷贝时,会调用合成的拷贝构造函数,
拷贝Query的数据成员,成员q由于是shared_ptr,其引用计数会加1.
-- 移动:当Query对象被移动时,会调用合成移动构造函数,会移动数据成员到新的对象。
在这个例子中,新对象中的shared_ptr会指向原对象的shared_ptr所指向的地址,新对象
的shared_ptr的引用计数加1,原对象的shared_ptr的引用计数减1。
-- 赋值:调用合成的赋值函数,结果与拷贝操作相同。
-- 销毁:调用合成的析构函数,shared_ptr的引用计数减1,如果其引用计数减至0,
则会释放它指向的内存。
15.33 当一个Query_base类型的对象被拷贝、移动、赋值或销毁时,将分别发生什么?
由于Query_base类中没有需要分配内存的数据成员,所以发生拷贝、移动、赋值或销毁,
合成的版本就可以用,Query_base是抽象类,所以发生拷贝、移动、赋值或销毁时,操作
的其实是它对应类型的子类。
15.34 针对图15.3构建的表达式:
(a) 列举出处理表达式的过程中执行的所有构造函数。
(b) 列举出cout << q所调用的rep。
(c) 列举出q.eval() 所调用的eval。
a. Query q = Query("firey") & Query("bird") | Query("wind");
Query::Query(std::string& s) s分别是"firey", "bird", "wind"
WordQuery::WordQuery(const std::string& s) s分别是"firey", "bird", "wind"
AndQuery::AndQuery(const Query& left, const Query& right)
BinaryQuery::BinaryQuery(const Query &l, const Query& r, std::string s)
Query::Query (std::shared_ptr<Query_base> query) // when call q->eval, q->rep
OrQuery::OrQuery(const Query& left, const Query& right)
BinaryQuery::BinaryQuery(const Query &l, const Query& r, std::string s)
Query::Query (std::shared_ptr<Query_base> query)
///
b. cout << q
在operator<<函数中调用的是Query的rep() ;
Query中的rep调用OrQuery中继承Query_base的rep,因为生成对象q调用的是”|“运算返回的Query。
但OrQuery中没有定义rep,因此调用的是Binary_Query中的rep;
Binary_Query中的rep由lhs和rhs调用。lhs调用的是AndQuery中的rep,rhs调用的是Word_Query中的rep;
AndQuery中调用的是Binary_Query中的rep;
Binary_Query中的rep调用的是Word_Query中的rep。
///
c q.eval() 所调用的eval
Query中的eval调用的是Query_base中的eval。
但这里Query_base指向的是OrQuery,所以调用的是OrQuery中的eval。
C++第十五章:文本查询类
最新推荐文章于 2020-08-25 14:29:00 发布