C++的this指针

C++的this指针C++的this指针当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。C++在初始化对象时,每个对象中的数据成员都会得到系统分配的自己独立的存储空间。对于成员函数来说,一个函数的代码段在内存中只有一份,同一个类中的不同对象在调用自己的成…

大家好,又见面了,我是你们的朋友全栈君。

C++的this指针

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

C++在初始化对象时,每个对象中的数据成员都会得到系统分配的自己独立的存储空间。对于成员函数来说,一个函数的代码段在内存中只有一份,同一个类中的不同对象在调用自己的成员函数时,,它们其实调用的是同一段函数代码。

那么问题来了,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是自己的数据成员而不是其他对象的数据成员呢? 那么我们就会使用this指针。

this指针的特性:

1、this指针的类型const(类名const),为右值。
2、this指针本身不占用大小,并不是对象本身的一部分,不影响sizeof的结果。
3、this的作用域在类成员函数的内部。
4、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。
5、只有在类的非静态成员函数中才可以使用this指针, 其它任何函数都不可以。
6、this指针时刻指向对象 。
7、当this指针指向空时,是不会指向对象的。

this指针的用处:

1.在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this
2.当参数与成员变量名相同时,如this->n = n (不能直接写n = n)。

下面我就第二点进行举例:

#include <iostream>
using namespace std;

class A {
private:
	int a = 1;
public:
	void seta(int a) {
		a = a;
	}
	void print() {
		cout << a << endl;
	}
};

int main() {
	A m;
	m.seta(5);
	m.print();
}

这段代码非常简单,我们的关注点主要在a = a这一句,然后这个代码运行结果是多少呢?可能许多人都认为是5吧,不过你如果把它复制到IDE里面调试看看却发现输出结果是1。

然后我们再把this指针加上试试:

#include <iostream>
using namespace std;

class A {
private:
	int a = 1;
public:
	void seta(int a) {
		this -> a = a;
	}
	void print() {
		cout << a << endl;
	}
};

int main() {
	A m;
	m.seta(5);
	m.print();
}

这时候答案就是5了。也就是说,成员函数的参数不能与对象的成员变量重名,如果一定要重名,就必须用this指针指明。

this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。

2019年4月7日

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145836.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月16日 下午1:20
下一篇 2022年5月16日 下午1:20


相关推荐

  • vue相比jquery_angular和vue哪个厉害

    vue相比jquery_angular和vue哪个厉害jQuery到Vue的转变是一个思想的转变,将原有的直接操作dom的思想转变到操作数据上前言:很多人说jquey和vue没有什么可比的,应该和Angular,React来比吧,我到觉得他们倒没有多大的可比性,都是基于mvvm思想设计的框架,无非就是实现的方式不一样,在不同场景下性能上会有一些差异。然而从jquery到vue或者说是到mvvm的转变则是一个思想想的转变,是将原有的直接操作dom的思想转变到操作数据上去,难道不是一个根本性的改变吗?jquery介绍:想必大家都用过jquery吧,这个曾经.

    2022年10月15日
    4
  • CQL概念

    CQL概念CQL 概念

    2026年3月18日
    2
  • 基于ARM Cortex-M和Eclipse的SWO单总线输出

    基于ARM Cortex-M和Eclipse的SWO单总线输出nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 最近在 MCUonEclipse 网站上看到 ErichStyger 所写的一篇有关通过 SWD 的跟踪接口 SWO 获取 ARMCortex M 相关信息的文章 文章结构明晰 讲解透彻 本人深受启发 特意将其翻译过来供各位同仁参考 当然限于个人水平 有不当之处恳请指正 原文网址 https mcuoneclipse com 2016 10 17 tutorial using single

    2026年3月20日
    2
  • Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」

    Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」前言前几篇文章中,笔者对View的三大工作流程进行了详细分析,而这篇文章则详细讲述与三大工作流程密切相关的两个方法,分别是requestLayout和invalidate,如果对Viwe的三个工作流程不熟悉的读者,可以先看看前几篇文章,以便能更容易理解这篇文章的内容。

    2022年6月2日
    40
  • Logback日志工具使用详解

    Logback日志工具使用详解由于Logback比log4j和SLF4J拥有众多优点,如性能(据说有时达到10倍以上),并且支持自动加载配置文件,自动删除旧的日志文件,以及同一个logback配置文件同时适应开发,测试,生产等。因此Logback官方强烈建议开发人员从log4j转到使用Logback。

    2022年6月17日
    35
  • 关于height:100%和height:100vh的区别

    关于height:100%和height:100vh的区别关于height:100%和height:100vh的区别vh就是当前屏幕可见高度的1%,也就是说height:100vh==height:100%;但是当元素没有内容时候,设置height:100%,该元素不会被撑开,此时高度为0,但是设置height:100vh,该元素会被撑开屏幕高度一致。…

    2022年4月28日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号