this指针
创始人
2024-05-24 07:03:09
0

目录

一、关于this指针的一个经典问题

二、this指针的特点

(一)本质

(二)应用

1. 不使用this指针

2. 使用this指针

3. 两者代码对比

三、代码举例

1. 举例1 

2. 举例2

 


一、关于this指针的一个经典问题

当你进入一个房子后,   
你可以看见桌子、椅子、地板等,   
但是房子你是看不到全貌了。   
对于一个类的实例来说,   
你可以看到它的成员函数、成员变量,   
但是实例本身呢?   
this是一个指针,它时时刻刻指向你这个实例本身

二、this指针的特点

  • this指针的类型:类类型* const,即成员函数中,不能给this指针赋值
  • 只能在“成员函数”的内部使用 
  • this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针 
  • this指针是“成员函数”第一个隐含的指针形参,通常this指针在系统中是隐含存在的,也可以把它显式表示出来 
  • 非静态成员函数中可以直接使用this来代表指向该函数作用对象的指针,静态成员函数中不能使用this指针,因为静态成员函数并不具体作用与某个对象,因此,静态成员函数真实的参数的个数,就是程序中写出的参数个数 

(一)本质

(二)应用

1. 不使用this指针

#include
using namespace std;
class A
{
private:int i;
public:void set(int x){i = x;}int get(){return i;}
};int main()
{A a;a.set(9);cout << a.get() << endl;return 0;
}

2. 使用this指针

#include
using namespace std;
class A
{
private:int i;
public:void set(int x)//给私有成员变量i赋值{this->i = x;//this指针指向的是当前对象(所谓当前对象就是,谁此时调用set函数,谁就是当前对象)cout << "this指针保存的内存地址为:" << this << endl;}int get(){return i;}
};int main()
{A a;a.set(9);//对象a调用set()函数给自己的成员变量i赋值cout << "对象a所在的内存地址为:" << &a << endl;cout << "对象a所保存的值为:" << a.get() << endl;cout << endl;A b;b.set(999);cout << "对象b所在内存地址为:" << &b << endl;cout << "对象b所保存的地址为:" << b.get() << endl;
}

 

3. 两者代码对比

三、代码举例

1. 举例1 

#include
using namespace std;
class Box
{
private:double length;//长double breadth;//宽double height;//高
public:Box(double l = 2.0, double b = 2.0, double h =2.0){cout << "Constructor called" << endl;length = l;breadth = b;height = h;}double Volume()//体积{return length * breadth * height;}int compare(Box box)//比较{return this->Volume() > box.Volume();}
};int main()
{Box Box1(3.3, 1.2, 1.5);Box Box2(2.5, 6.0, 2.0);if (Box1.compare(Box2))//Box1调用的成员函数compare,所以this指针指向的是Box1{cout << "Box1 is bigger than Box2!" << endl;}else{cout << "Box1 is smaller or equal than Box2!" << endl;}return 0;
}

 

2. 举例2

代码举例2:
#include
using namespace std;
class complex
{public:double real,imag;void print(){cout<real++;//等价于real++ this->print();//等价于print return *this;//this指针指向了调用addone()函数的对象 }
};
int main()
{complex c1(1,1);complex c2(0,0);c2=c1.addone();//c1.anddone会调用addone函数,this指向addone()函数所作用的对象c1,//导致c1的real加1,也就变成了2,然后this指向的print()函数所作用的对象c1,打印c1的real=2,imag=1 return 0;
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...