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

 #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

C++学习笔记之this指针的更多相关文章

  1. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  2. C++学习笔记: 智能指针

    c++ 智能指针学习新的 class Simple { public: Simple() { number = param; std::cout << "Simple: &quo ...

  3. C++学习笔记之函数指针

    与数据项类似,函数也有地址.函数的地址是存储其机器语言代码的内存开始的地方. 一.函数指针的基础知识 假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都 ...

  4. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  5. C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)

    三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...

  6. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  7. [C#学习笔记]类型对象指针和同步块索引

    写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...

  8. C语言学习笔记--函数与指针

    1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如 int add(int i,int j)的类型为 int(int,int). (2)C 语言中 ...

  9. C++学习笔记30,指针的引用(2)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...

随机推荐

  1. CSS使jsp图片旋转90度

    <style > img{ margin:100px auto 0; -moz-transform:rotate(-90deg); -webkit-transform:rotate(-90 ...

  2. 将错误日志记录在txt文本里

    引言 对于已经部署的系统一旦出错对于我们开发人员来说是比较痛苦的事情,因为我们不能跟踪到错误信息,不能 很快的定位到我们的错误位置在哪,这时候如果能像开发环境一样记录一些堆栈信息就可以了,这时候我们就 ...

  3. JS代码的简单重构与优化

    JS代码的简单重构与优化(适合新手) 原文  http://www.cnblogs.com/similar/p/5016424.html Demo . 1 //bad if (age > 20) ...

  4. miracast 协议wifi display

    看wifi direct display标准的地方: http://www.wi-fi.org/discover-wi-fi/specifications Miracast依赖的Wi-Fi技术项[②] ...

  5. linux 从命令行自动识别文件并将其打开的命令

    若是shell是 zsh,则可: 使用 alias -s 定义后缀别名 (zsh) % alias -s pl=perl % script.pl perl script.pl % alias -s p ...

  6. cookie一些简单的操作

    cookie 保存数据      document.cookie=name+'='+value+';expires='+date; //name=shiyou ;expires=Tue Mar 08 ...

  7. Mac下安装eclipse+python+pydev+numpy+matplotlib

    *本人亲测是成功的安装过程 1.更新Mac系统默认低版本的python2.7.请参见这篇文章:http://jingyan.baidu.com/article/14bd256e39b63dbb6d26 ...

  8. XSS攻击及防御(转)

    add by zhj: 略有修改.另外还有一篇文章值得参考,使用 PHP 构建的 Web 应用如何避免 XSS 攻击,总得来说防御XSS的方法是客户端和服务端都 要对输入做检查,如果只有客户端做检查, ...

  9. ControlsFX8.0.2中对话框无法判断是否显示的修改

    在org.controlsfx.dialog.FXDialog.java中加入 public abstract boolean isShowing(); 在org.controlsfx.dialog. ...

  10. java.io.IOException: Messenger was closed

    程序运行一段时间后抛出异常java.io.IOException: Messenger was closed,不知道是啥原因? ———————————————————————————————————— ...