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


相关推荐

  • mysql实现类似rownumber()的效果

    mysql实现类似rownumber()的效果–Createtesttablecreatetabletmp_test(empidint,deptidint,salarydecimal(10,2));–Inserttestdatainsertintotmp_testvalues(1,10,5500.00),(2,10,4500.00),(3,20,1900.00),(4,20,

    2022年5月21日
    50
  • ThreadPoolTaskExecutor和ThreadPoolExecutor区别

    ThreadPoolTaskExecutor和ThreadPoolExecutor区别之前工作中发现有同事在使用线程池的时候经常搞混淆ThreadPoolTaskExecutor和ThreadPoolExecutor,座椅在这里想写一片博客来讲讲这两个线程池的区别以及使用ThreadPoolExecutor这个类是JDK中的线程池类,继承自Executor,Executor顾名思义是专门用来处理多线程相关的一个接口,所有县城相关的类都实现了这个接口,相关的继承实现类图如下…

    2022年7月26日
    11
  • Java(2)-Java IO输入输出流

    Java(2)-Java IO输入输出流1.什么是IOJava中I/O操作主要是指使用Java进行输入,输出操作.Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。Java.io是大多数面向数据流的输入/输出类的主要软件

    2022年4月29日
    109
  • android如何获取证书签名?

    android如何获取证书签名?cygwin环境下在cygwin环境下运行如下命令,输出结果即为signaturekeytool-exportcert-alias[alias]-keypass[aliaspassword]-keystore[keystorefilepath]-storepass[keystorepassword]|md5sum 例如:当前路径下包含用于对app签名的t

    2022年5月31日
    110
  • 建立内网Windows补丁服务器「建议收藏」

    建立内网Windows补丁服务器建立内网Windows补丁服务器实施方案一、完成内网WSUS服务器的架设。二、对客户端计算机进行设置。三、进行外网WSUS服务器的架设。建立内网Windows补丁服务器众所周知,Windows系统有着种种安全漏洞和不足,这些都要依靠微软发布的一个个补丁来弥补,但公司内网无法访问Internet,,不能及时地下载更新。补丁的分发是微软应尽的责任,所以他们开发了WindowsServerUpdateServices(简称WSUS)这一软件,可以实现通过一台服务器下载更新

    2022年4月16日
    50
  • 内存泄漏与内存溢出的区别

    内存泄漏与内存溢出的区别

    2021年10月21日
    67

发表回复

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

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