为了说明这个问题,首先来建立一个简单的类

 #include <iostream>
#include <string> using namespace std; class Book
{
private:
string title;
int year;
double price;
public:
double getPrice() const { return price;}
}

这个类是关于书籍信息的简单表示,它可以让程序查看一系列书籍,找到价格最低的那一本,然后返回该本书籍的信息。这种方法是,定义一个成员函数,它查看两个Book对象,并返回价格较低的那个对象的引用。但是实现这种方法时,将会出现一些有趣的问题。

首先,如何将两个要比较的对象提供给成员函数呢?加入将该方法命名为lowprice(), 声明两个对象Book book1和Book book2, 则函数调用book1.lowprice()将访问book1对象数据,而book2.lowprice()将访问book2对象数据。如果希望该方法对两个对象比较,则必须将第二个对象作为参数传递给它。可以按引用来传递参数(效率较高),即lowprice()方法使用一个类型为const Book &的参数,这里加上const限定符的意思是方法执行过程中不改变该参数的值。

其次,如何将方法的答案(即价格较低的Book对象,这里不要以为只返回价格,因为我们要的是价格较低的书籍的全部信息,所以要返回对象)传回给调用程序呢?最直接的方法是让方法返回一个引用,该引用指向价格较低的书籍的对象。因此,用于比较的方法原型如下:

const Book & lowprice(const Book & b) const;

这里这么多const, 不要晕了,如果晕了,建议好好学习下const限定符的用法,这里我简单解释下第一个const表示函数返回的引用是个常量(两个Book 对象之一),参数前面的const表示程序运行过程中该参数的值不允许修改,方法参数列表后面的const 表示该方法不允许修改对象的成员变量值,也就是说,它就是把常量拿来比较,返回一个常量,但是无权修改任何值。

假设要对两个对象Book book1和Book book2进行比较,并将其中一个价格较低的哪一个赋给low对象(Book low),可使用下面的语句之一:

 low = book1.lowprice(book2);
low = book2.lowprice(book1);

形式有了,现在就是要注意lowprice()的实现,它将引发一个小问题。下面的部分实现强调了这个问题:

 const Book & Book::lowprice(const Book & b) const
{
if (b.price < price)
return b;
else
return ????;
}

为什么会这样呢?如果b.price小于price, 返回指向b的引用,否则,返回用来调用该方法的对象,问题在于,如何称呼这个对象?(这句话一定要理解,否则就看不到问题所在)

好了,该this指针出场了,

  • 所有类方法都将this指针设置为调用它的对象的地址,如:Book c; this就指向对象c的地址
  • this指针是作为隐参数传递给类中所有方法的;
  • 上面getPrice()方法中price只不过是this->price的简写
  • 每个成员函数(包括构造函数和析构函数)都有一个this指针。this指向调用对象,如果方法需要引用整个对象,则可以使用表达式*this,因为this是对象的地址,所以对象本身就是*this.

现在可以将*this作为调用对象的别名来完成前面的定义:

 const Book & Book::lowprice(const Book & b) const
{
if (b.price < price)
return b;
else
return *this;
}

返回类型为引用意味着返回的是调用对象本身,而不是其副本。

01:18:36

最新文章

  1. 常用类String的方法
  2. Array补充方法
  3. UVA 1069 - Always an integer(数论)
  4. eclipse修改SVN下载的项目“&gt;”变成“*”
  5. SqlServer 数据库日志无法收缩处理过程
  6. [python笔记][第二章Python序列-list]
  7. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
  8. 一个页面从输入URL到页面加载显示完成的详细过程
  9. Provably Delay Efficient Data Retrieving in Storage Clouds---INFOCOM 2015
  10. 帝国cms文章内容tags关键词设置调用方法以及tags静态化
  11. 移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势
  12. Bat脚本自动卸载软件-静默执行
  13. proc文件系统探索 之 以数字命名的目录
  14. Vector 特性
  15. 使用JWT来实现对API的授权访问
  16. SqlSever大数据分页【转】
  17. Linux设置和查看环境变量的方法 详解
  18. 【linux】linux修改open file 大小
  19. 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
  20. Python建代理配合burp实现自动免费用水

热门文章

  1. Golang几个常用记录日志对比
  2. C# 一个简单的秒表引发的窗体卡死问题
  3. python中的文件
  4. 传统企业,&quot;哀兵必胜&quot;的想法要不得
  5. 搞JAVA在北京月薪15K的朋友来到厦门却很难找到工作
  6. Apriori算法例子
  7. MFC学习20160718(GetModuleFileName&amp;amp;&amp;amp;GetAppDataPath)
  8. BITED数学建模七日谈之六:组队建议和比赛流程建议
  9. RPC进阶篇
  10. Yii 1 数据库操作 笔记