C++第十五章:文本查询类

mac2024-12-04  27

当一个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。
最新回复(0)