当一个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
)
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。