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日

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • eclipse汉化版使用教程(安卓市场(官方版本))

    Eclipse汉化教程1.确定Eclipse的版本方法一:打开eclipse,在启动画面中可以看到eclipse的版本名称(我的版是Photon),记住这个版本的名称;方法二:在Eclipse启动后,点击菜单栏中的**Help(帮助)&amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;gt;AboutEclipse(关于EclipseIDE)**会弹出的AboutEclipse窗口,在这里也可以找到当前Ec

  • html练习(5)

    html练习(5)

  • 跨机器的文件传输

    跨机器的文件传输

  • vim 配置文件 .vimrc

    vim 配置文件 .vimrc在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:$vi~/.vi

  • 从零实现一个 Promise

    从零实现一个 Promise

  • 在 docker 之间导出导入镜像「建议收藏」

    在 docker 之间导出导入镜像「建议收藏」很喜欢玩docker,但最新遇到一个问题,公司给的新机器的dns有问题,导致pull不下来镜像。没办法了,没有镜像什么神马都干不了,又不能花很多时间去搭建私有的镜像库,只有另寻办法了。废话少说,经过探究,发现docker提供把镜像导出export(保存save)为文件的机制,这样就可以把镜像copy到任意地方了。1.导…

发表回复

您的电子邮箱地址不会被公开。

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