学习【菜鸟教程】【C++ 类 对象】【C++ this 指针】

news/2024/11/16 20:49:34/

文章目录

  • 1. 教程
  • 2. 评论一
  • 3. 评论二

1. 教程

链接

在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。

友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。

下面的实例有助于更好地理解 this 指针的概念:

#include <iostream>using namespace std;class Box
{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();}private:double length;     // Length of a boxdouble breadth;    // Breadth of a boxdouble height;     // Height of a box
};int main(void)
{Box Box1(3.3, 1.2, 1.5);    // Declare box1Box Box2(8.5, 6.0, 2.0);    // Declare box2if(Box1.compare(Box2)){cout << "Box2 is smaller than Box1" <<endl;}else{cout << "Box2 is equal to or larger than Box1" <<endl;}return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Constructor called.
Constructor called.
Box2 is equal to or larger than Box1

2. 评论一

当我们调用成员函数时,实际上是替某个对象调用它。

成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化 this。例如,如果调用 total.isbn()则编译器负责把 total 的地址传递给 isbn 的隐式形参 this,可以等价地认为编译器将该调用重写成了以下形式:

//伪代码,用于说明调用成员函数的实际执行过程
Sales_data::isbn(&total)

其中,调用 Sales_data 的 isbn 成员时传入了 total 的地址。

在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无须通过成员访问运算符来做到这一点,因为 this 所指的正是这个对象。任何对类成员的直接访问都被看作是对 this 的隐式引用,也就是说,当 isbn 使用 bookNo 时,它隐式地使用 this 指向的成员,就像我们书写了 this->bookNo 一样。

对于我们来说,this 形参是隐式定义的。实际上,任何自定义名为 this 的参数或变量的行为都是非法的。我们可以在成员函数体内部使用 this,因此尽管没有必要,我们还是能把 isbn 定义成如下形式:

std::string isbn() const { return this->bookNo; }

因为 this 的目的总是指向“这个”对象,所以 this 是一个常量指针,我们不允许改变 this 中保存的地址。

3. 评论二

#include <iostream>
using namespace std;class Box{public:Box(){;}~Box(){;}Box* get_address()   //得到this的地址{return this;}
};int main(){Box box1;Box box2;// Box* 定义指针p接受对象box的get_address()成员函数的返回值,并打印Box* p = box1.get_address();  cout << p << endl;p = box2.get_address();cout << p << endl; return 0;
}

this 指针的类型可理解为 Box*

此时得到两个地址分别为 box1 和 box2 对象的地址。


http://www.ppmy.cn/news/84942.html

相关文章

html实现酷炫科技风大屏风格模板(附源码)

文章目录 1.设计来源1.1 大屏主界面1.2 弹框界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130870963 html实现酷炫科技风大屏风格模板源码 &#xff0c;html大屏源码…

Java 与查找算法(1):顺序查找

一、顺序查找 顺序查找&#xff0c;也称为线性查找&#xff0c;是一种简单的查找算法&#xff0c;它从列表的开头开始逐一比较每个元素&#xff0c;直到找到目标元素或搜索到列表的末尾。顺序查找适用于小型列表或未排序的列表&#xff0c;但对于大型、有序的列表&#xff0c;…

通信原理 | 傅里叶变换(先立个贴在这,还没写好)

概念 傅里叶变换是一种将一个信号(可以是声音、图像等)从时域(时间轴上)转换到频域(频率轴上)的数学工具。 它可以将一个复杂的信号分解成若干简单的正弦波,每个正弦波都有自己的频率、振幅和相位。这个过程可以被看作是把一个复杂的信号拆分为若干个单频信号的叠加。…

常用五大类RFID系统,实践领域广泛,加强现代化管理

随着信息技术的不断进步&#xff0c;RFID技术已逐渐成为企业管理及社会服务领域中不可或缺的一种重要技术手段。根据其不同的应用场景&#xff0c;RFID技术广泛应用于药品监管、固定资产管理、仓储管理、智慧工厂和消费服务等领域。本文将从五个方面介绍常用的RFID系统。 一、…

opencv_c++学习(二十二)

一、凸包检测 图中左侧为边缘检测的效果&#xff0c;中间为图像经过二值化的效果&#xff0c;右图为凸包检测效果。 convexHull(lnputArraypoints, OutputArray hull&#xff0c;bool clockwise false, bool returnPoints true)points:输入的2D点集。 hull:输出凸包的顶点。…

rpc的相关知识

rpc ,http, restful的区别  网上充斥着各类类似于这样的文章&#xff1a;rpc 比 http 快了多少倍&#xff1f;既然有了 http&#xff0c;为什么还要用 rpc 调用等等。遇到这类文章&#xff0c;说明对 http 和 rpc 是由理解误区的。  实际上二者存在性以及速度是不好比的。 通…

如何基于LiveNVR实现无人机等RTMP推流转成GB28181协议级联到GB28181视频平台

1、需求介绍 目前很多移动终端设备&#xff08;如无人机等&#xff09;只支持RTMP推流输出&#xff0c;不支持GB28181协议。但是又有需要通过GB28181协议接入到视频平台的需求。比如有些大疆无人机产品不能直接注册国标平台&#xff0c;只能rtmp推流。那么&#xff0c;项目中如…

DataX-一款稳定高效的数据同步工具-从安装、启动、配置、使用总结,看这篇让你一步到位

前言 大数据部门现阶段ETL按同步方式分为两种&#xff1a; 实时同步&#xff1a;DTS、CloudCanal离线同步&#xff1a;dataworks-DI节点 但CloudCanal在使用中出现了部分问题&#xff0c;归纳总结后主要为以下几点&#xff1a; 部分使用场景获取不到binlog点位停止任务&…