c++中 this指针详解[通俗易懂]

c++中 this指针详解[通俗易懂]this是c++中的一个关键字,也是一个常量指针,指向当前对象,也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。【特性】1. this指针的类型是类类型*const2. this指针并不是对象本身的一部分,不会影响sizeof的结果3. this的作用域在类成员函数的内部4. this指针是类成员函数的第一个默认隐含参数,

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

this 是 c++中的一个关键字,也是一个常量指针,指向当前对象,也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。

【特性】

1.  this指针的类型是 类类型* const

2.  this指针并不是对象本身的一部分,不会影响sizeof的结果

3.  this的作用域在类成员函数的内部

4.  this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递

5.  只有在类的非静态成员函数中才可以使用this指针



所谓的当前对象,就是正在使用的对象,例如stu.print(); stu 就是当前对象,系统正在访问stu的成员函数print()


假设this指向stu对象 那么 下面的pStu 的值就和this的值相同

Student stu;
Student *const pStu = &stu;


下面演示一个完整的例子

#include <iostream>
using namespace std;

class Student
{
public:
	void setName(char *);
	void setAge(int );
	void print();
private:
	char *name;
	int age;
	double score;
};

void Student::setName(char* name)
{
	this->name = name;
}
void Student::setAge(int age)
{
	this->age = age;
}

void Student::print()
{
	cout << this->name << ":" << this->age << "岁" <<endl;
}
int main()
{
	Student stu1;
	stu1.setName("小王");
	stu1.setAge(18);
	stu1.print();

	Student stu2;
	stu2.setName("李元霸");
	stu2.setAge(16);
	stu2.print();

	return 0;
}

输出结果:

小王:18岁
李元霸:16岁



对象和普通的变量类似,每个对象都占用若干字节的内存,用来保存成员变量的值,

不同对象占用的内存互不重叠。

上面的例子中创建stu1时,this指针就指向了stu1所在内存块的首字节,创建stu2时,this指针就指向了stu所在内存块的首字节…


现在添加下面的函数 用来输出this的值,验证this的值与 对象的地址是否相同:


void Student::printAddr()
{
    cout << this << endl;
}


接着在main函数中输出创建对象并调用函数:


int main()
{
	Student stu1;
	Student *pStu1 = &stu1;
	stu1.printAddr();
	cout << pStu1 << endl;

	Student stu2;
	Student *pStu2 = &stu2;
	stu2.printAddr();
	cout << pStu2 << endl;

	return 0;
}

输出结果:

0030FBEC
0030FBEC
0030FBC8
0030FBC8


输出结果显示了this确实指向了当前对象的首地址,而且对于不同的对象,this的值也不一样。


切记:

~~this 是常量指针,它的值不能被修改

~~this 只能在成员函数内部使用

~~只有对象被创建后this才有意义,因此不能再static成员函数中使用


实际上,this指针是作为函数的参数隐式传递的,它并不出现在参数列表中,调用成员函数时,系统(编译器)自动获取当前对象的地址,并赋给this,完成参数的传递。


this作为隐式参数,本质上是成员函数的局部变量,不占用对象的内存,只有在发生成员函数调用时才会给this赋值,函数调用结束,this被销毁。


在《C++函数编译原理和成员函数的实现》讲到,成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以在编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。


  这个额外的参数也就是this  ,它是成员函数和成员变量之间的桥梁




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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • send()、sendto()和recv()、recvfrom()的使用

    send()、sendto()和recv()、recvfrom()的使用udp通讯中的sendto()需要在参数里指定接收方的地址/端口,recvfrom()则在参数中存放接收发送方的地址/端口,与之对应的send()和recv()则不需要如此,但是在调用send()之前,需要为套接字指定接收方的地址/端口(这样该函数才知道要把数据发往哪里),在调用recv()之前,可以为套接字指定发送方的地址/端口,这样该函数就只接收指定的发送方的数据,当然若不指定也可,该函数就可以

    2022年7月23日
    9
  • mysql 数据库连接_java连接oracle数据库

    mysql 数据库连接_java连接oracle数据库原理:Oracle数据网关,就像一个桥梁,贯通oracle数据库和non-oracle数据库。在配置过程中,我们经常讲到的三个重要文件:第一、tnsnames.ora;第二、lisener.ora;第三、init.ora。他们是如何工作呢?比如对一个连接数据库的查询,select*from“tablename”@linkdbname;oracle首先从linkdbname开始,通过dba_d…

    2025年11月15日
    1
  • C语言scanf()函数「建议收藏」

    C语言scanf()函数「建议收藏」scanf()函数基础扩充

    2022年8月3日
    10
  • noip竞赛历年试题_noip2017提高组复赛试题

    noip竞赛历年试题_noip2017提高组复赛试题在线评测:http://codevs.cn/problem/1136/整体思路:失误之处:体会心得:AC代码:

    2022年9月24日
    3
  • potplayer软件安装与常用配置

    potplayer软件安装与常用配置potplayer软件安装与常用配置1安装potplayer是一款十分好用的视频播放器,可以播放很多格式的视频,自定义皮肤,任意倍速,截取视频片段,还可以播放直播源(比如中国的CCTV以及各大卫视)…potplayer网址下载安装即可,最后如果显示要安装插件的话,去掉勾选即可2使用设置无边框:首先打开设置界面(快捷键F5),勾选如下两项设置打开视频时,默认居中显示,非全屏:首先打开设置界面(快捷键F5),进行如下两项设置进度条缩略图:首先打开设置界面(快捷键F5

    2022年5月11日
    94
  • 为企业数字化转型提供服务_数字赋能企业转型

    为企业数字化转型提供服务_数字赋能企业转型企业数字化转型必备利器之微服务扩展

    2022年4月21日
    40

发表回复

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

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