首页 > 编程语言 > 详细

C++PRIMER-5TH 15.9 文本查询程序再探 练习理解(二)

时间:2014-01-21 23:43:28      阅读:680      评论:0      收藏:0      [点我收藏+]

从对象角度进行的思考。2014-01-21

------------------------------------------------------------

从main()函数说起

Query q1("the");

Query q(q1);

这两句,分别展示了Query类的两种构造函数。

第一种是,接受一个字符串,给类成员对象 q 赋值为 new WordQuery(s) ,q 的类型是shared_ptr<Query_base>,也就是说,q 的值是地址。 

Query(const std::string &s) : q(new WordQuery(s))
{
  cout << "Query::Query(const std::string &s) " <<s<< endl;
}

第二种是,接受一个shared_ptr<Query_base>的变量(其实是个地址),然后把该地址赋给成员变量 q,main()函数中,Query q(q1) ,q1的成员变量是 new WordQuery(s)的地址。

Query(shared_ptr<Query_base> query) : q(query)
{
  cout << "Query(shared_ptr<Query_base> query) " << endl;
}

总结起来,赋值到底赋的是什么?是类型中的成员变量!! (暂不涉及类型转换)

下面看最复杂的。

Query q = Query("was") & Query("the") | Query("were");

执行顺序先确定下,((was & the) | were)。

首先,等号右边,有三个带字符的Query类型,所以,有调用三次Query(const std::string &s) ,各自对象内的成员变量q都有各自的地址。

接下来,执行内层括号的 & 运算符,形参列表是,分别在&号左右两侧对象的引用,实际上传的是两个地址,因为Query类型的对象只有一个成员变量,并且是地址值。

Query operator& (const Query& lhs, const Query& rhs)
{
  cout << "Query operator& " << endl;
  return shared_ptr<Query_base>(new AndQuery(lhs, rhs));
}

因此(was & the) 就等于 shared_ptr<Query_base>(new AndQuery(lhs, rhs)),说白了就是个地址。我暂时把这个地址 定义为 addr。(这么定义,其实是因为编译器确实创建了一个Query temp = (was & the)的地址,只是这是一个临时变量)

接着addr | Query("were"),| 运算符,形参列表同样接受两个对象(其实是地址)。

Query operator| (const Query& lhs, const Query& rhs)
{
  cout << "Query operator| " << endl;
  return shared_ptr<Query_base>(new OrQuery(lhs, rhs));
}

最后返回的是 shared_ptr<Query_base>(new OrQuery(lhs, rhs)),一个地址。C++很有意思的地方就在这里,地址指向对象,对象里存的还是地址。。

程序运行结果:

Query::Query(const std::string &s) were
Query::Query(const std::string &s) the
Query::Query(const std::string &s) was
Query operator&
BinaryQuery
AndQuery
Query(shared_ptr<Query_base> query)
Query operator|
BinaryQuery
OrQuery
Query(shared_ptr<Query_base> query)

从运行结果中,可以看出来,每一个类的构造函数运行的情况。

上面执行的只是 Query q = Query("was") & Query("the") | Query("were"); 这么一句。

C++PRIMER-5TH 15.9 文本查询程序再探 练习理解(二)

原文:http://www.cnblogs.com/wk23/p/3529057.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!