C++学习笔记之this指针
为了说明这个问题,首先来建立一个简单的类
#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指针的更多相关文章
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- C++学习笔记: 智能指针
c++ 智能指针学习新的 class Simple { public: Simple() { number = param; std::cout << "Simple: &quo ...
- C++学习笔记之函数指针
与数据项类似,函数也有地址.函数的地址是存储其机器语言代码的内存开始的地方. 一.函数指针的基础知识 假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都 ...
- C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...
- C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)
三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
- [C#学习笔记]类型对象指针和同步块索引
写在前面 看<CLR via C#>第四章时,看到了类型对象指针和同步块索引这两个概念,不知如何解释,查看过相关资料之后,在此记录. 类型对象指针 <CLR via C#>中的 ...
- C语言学习笔记--函数与指针
1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如 int add(int i,int j)的类型为 int(int,int). (2)C 语言中 ...
- C++学习笔记30,指针的引用(2)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guang_jing/article/details/32910093 能够创建不论什么类型的引用,包 ...
随机推荐
- ASP.NET Web API 帮助(help)页面上没有 Test API按钮的解决方法
参与一个web API项目时发现它的help页面特别好用,不仅可以根据webapi的方法和注释自动生成帮助文档以方便查阅,还可以在这个页面上测试webapi方法.于是在自己新建项目时也打算将这个hel ...
- 浅谈Android五大布局——LinearLayout、FrameLayout、AbsoulteLayout、RelativeLayout和TableLayout
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...
- Golang官方图片库
Golang 的图片出来通过提供操作每一个像素点设置颜色(http://www.cnblogs.com/ghj1976/p/3441536.html) 和 提供通过可选蒙版图片重叠操作 (http:/ ...
- 怎样为EXCEL2010添加下拉列表
注意,下面是Excel2010的步骤和截图,其他版本的Excel类似. 首先用鼠标左键点击你要添加下拉列表的单元格. 如果你只想部分区域有下拉列表,也可以选择部分区域. 下面图片是选择的整个列都是 ...
- ASCII和16进制
所谓的ASCII和16进制都只是概念上的东西,在计算机中通通是二进制 转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样ASCII是针对字符的编码,几乎是键盘上的字符的编码 ...
- Folding
题意: 给定一个串,求能化成的最短循环节串(把重复字符串转化成循环节形式) 分析: 不是太好想,如果让求最短长度还好,dp[i][j],表示区间[i,j]化成的最小长度,dp[i][j]=min(dp ...
- sqlserver数据可空插入报错
数据库和C#中均为可空类型. 这时候直接给字段赋值为null parameters[9].Value = null : 执行的时候报错了,一大堆,总之说它少了一个参数. 用sql ser ...
- 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记
首先,这本书是Linux.CN赠送的,多谢啦~ http://linux.cn/thread-12733-1-1.html http://linux.cn/thread-12754-1-1.html ...
- C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- debian7下部署nginx服务器
笔者是在vmware中的Debian7下部署nginx服务器,采用离线部署方式.过程如下: 1.准备好需要的离线安装包 nginx-1.6.2.tar.gz,pcre-8.34.tar.gz,open ...