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 能够创建不论什么类型的引用,包 ...
随机推荐
- 【PHP入门到精通】:Ch03:PHP语言基础
1, PHP风格 这里为了显示代码把"<"和">"和key值以空格分开了,实际书写时切记不要将其分开: (1) < ?php ? >: ...
- Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_from_list_by_label(self, locator, *labels)
def select_from_list_by_label(self, locator, *labels): """Selects `*labels` from list ...
- linux 常用端口列表
常见端口表汇总 1 tcpmux TCP Port Service Multiplexer 传输控制协议端口服务多路开关选择器 2 compressnet Management Utility com ...
- Maven依赖
可传递的依赖: 1.具体调用哪个版本?最短依赖长度的那个 如:A -> B -> C -> D 2.0 , A -> E -> D 1.0,那么调用D 1.0 为了避免这 ...
- QCon2013上海站总结 -- 整体印象和感悟
基本情况: QCon 2013(http://www.qconshanghai.com/)上海站的活动一共为期3天(周五.六和日).活动在上海的光大会展中心举行的. QCon(全球软件开发者大会)是由 ...
- 轻松学Shell之认识正规表达式
离线下载观看:http://down.51cto.com/data/148117 650) this.width=650;" onclick='window.open("htt ...
- 转】用Maven构建Mahout项目
原博文出自于: http://blog.fens.me/hadoop-mahout-maven-eclipse/ 感谢! 用Maven构建Mahout项目 Hadoop家族系列文章,主要介绍Hadoo ...
- Spark RDD概念学习系列之RDD的checkpoint(九)
RDD的检查点 首先,要清楚.为什么spark要引入检查点机制?引入RDD的检查点? 答:如果缓存丢失了,则需要重新计算.如果计算特别复杂或者计算耗时特别多,那么缓存丢失对于整个Job的影响是不容 ...
- Spark RDD概念学习系列之RDD的创建(六)
RDD的创建 两种方式来创建RDD: 1)由一个已经存在的Scala集合创建 2)由外部存储系统的数据集创建,包括本地文件系统,还有所有Hadoop支持的数据集,比如HDFS.Cassandra.H ...
- cocos2d-x 2.2.5 安卓工程编译的问题
原址:http://www.cocoachina.com/bbs/read.php?tid=217124 新的cocos2d-x 2.2.5 在使用Eclipse的安卓NDK 9 的编译器进行编译的时 ...