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

 #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. [转] C#中的Dictionary的使用

    txw1958 的 原文 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键 ...

  2. nginx服务器防sql注入/溢出攻击/spam及禁User-agents

    本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可  代码如下 复制代码 server { ...

  3. Win7安装IDL8.0以及破解

    参考:http://bbs.06climate.com/forum.php?mod=viewthread&tid=5230 1.下载IDL8.1和证书 下载地址:http://yunpan.c ...

  4. Div 自适应屏幕大小

    http://blog.csdn.net/wodetiankong516/article/details/7827256 Background      有时, 我们需要将div或者其他的Elemen ...

  5. html --- SVG --- javascript --- 旋转矩形

    可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...

  6. MarkdownPad 破解学习

    最近学习 Markdown,从网上下载了 Windows 下的编辑器:MarkdownPad.这款软件分为免费版和专业版(收费), 对于普通用户来说免费版已经足够,专业版比免费版多了如下几个功能: 一 ...

  7. codejam环境熟悉—Minimum Scalar Product

    今天准备熟悉一下codejam的在线编程,为google的笔试做准备,因此按照codejam上对新手的建议,先用了一个简单的题目来弄清楚流程.记录一下需要注意的地方.   1.输入输出 输入输出重定位 ...

  8. bool?

    public class GuestResponse { [Required(ErrorMessage = "Please enter your name")] public st ...

  9. 第二百一十二天 how can I 坚持

    在家待了一天,过个周六日也就这样,时间.感觉好堕落. 下午心情特烦闷.好想结婚.为什么不认输,为什么会这样.这到底是一种什么心态. 哎.不懂自己. 睡觉. fordream.

  10. E2202 Required package 'VclJPG' not found

    xe8 [dcc32 Fatal Error] RaizeComponentsVcl_Design.dpk(40): E2202 Required package 'VclJPG' not found ...