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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MAC常用快捷键 基本常用的都整理在这里了[通俗易懂]

    MAC常用快捷键 基本常用的都整理在这里了

    2022年2月8日
    47
  • 深信服(scsa认证)学习过程[通俗易懂]

    深信服(scsa认证)学习过程[通俗易懂]今天我们来说说关于企业招聘的文艺2级标题3级标题四级标题五级标题六级标题

    2022年6月20日
    68
  • nginx负载均衡原理简介_负载均衡算法有哪些

    nginx负载均衡原理简介_负载均衡算法有哪些前言今天这篇文章介绍了负载均衡的原理以及对应的四种负载均衡算法,当然还有对应的指令及实战,欢迎品尝。有不同意见的朋友可以评论区留言!负载均衡所谓负载均衡,就是Nginx把请求均匀的分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。Nginx在AKF可扩展立方体上的应用在x轴上,可以通过横向扩展应用服务器集群,Nginx基于Round-Robin或者Least-Connected算法..

    2022年8月31日
    4
  • UCOSII操作系统 第3课—UCOSII启动过程

    UCOSII操作系统 第3课—UCOSII启动过程1、初始化UCOSII(1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构。(2)其中,在OSInit()函数中建立空闲任务OS_TaskIdle();这个任务总是处于就绪态的,空闲任务的优先级是设置为最低的。(3)调用OSInit以后,任务控制块缓冲池中有OS_MAX_TASKS个任务控制块,事件控制缓冲区中有OS_MAX_EVENTS个事件控制块,消息队列缓冲池OS_Q中有OS_MAX

    2022年5月29日
    32
  • 二叉树算法(java)

    为什么实用二叉树一,在有序数组中插入删除数据太慢   1插入或者删除一条数据会移动后面的所有数据 二,在链表中查找数据太慢  2查找只能从头或者尾部一条一条的找用树解决问题   有没有一种插入和删除像链表那么快,查询可以向有序数组一样查得快那样就好了。 数实现了这些特点,称为了最有意思的数据结构之一树的术语如下图树分平衡树和非平衡树二叉树的类publicclassTree{ …

    2022年4月9日
    41
  • mybatisplus basemapper原理(提供两瓶水)

    MybatisPlus为什么提供BaseMapper和IService两个相似CRUD操作的接口?转载自:https://blog.csdn.net/krismile__qh/article/details/99590872熟悉mybatis-plus的人都知道,mybatis-plus提供两种包含预定义增删改查操作的接口:com.baomidou.mybatisplus.core…

    2022年4月12日
    317

发表回复

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

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