C++学习笔记(this指针)

本文通过实例解析C++中的this指针,探讨当成员函数的形参与类的私有数据同名时,如何使用this指针解决赋值问题。通过分析成员函数的实际形参,展示了this指针在成员函数调用过程中的作用,帮助理解对象调用成员函数时,this指针是如何传递对象地址的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,要理解什么是指针?简单的说指针就是地址。例如int a=3;定义整型变量a,并给a赋初值为3。在定义a的时候,系统会为变量a分配内存,内存是有地址的,就像每个房间都有自己的房间号一样。这里我们假设a的地址为0xf0,接着定义指针变量int *p=&a;表明指针变量p存放的是a的地址(0xf0)。因此,指针变量就是用来存放地址的变量。在C++中提供了类,假设定义了如下的类:

#include<iostream>
using namespace std;
class Test
{
public:
Test(int d)//构造函数
{
data=d;
}
void show()//成员函数
{
cout<<data<<endl;
}
private:
int data;
};
int main()
{
Test t1(10);//调用构造函数
Test t2(20);//调用构造函数
t1.show();//调用成员函数
t2.show();//调用成员函数

}

在主程序的第三行,通过对象调用成员函数来显示data;运行结果如下:


现在,我们将程序改为如下的形式:

#include<iostream>
using namespace std;
class Test
{
public:
Test(int data)//构造函数,形参与私有数据同名
{
data=data;
}
void show()//成员函数
{
cout<<data<<endl;
}
private:
int data;
};
int main()
{
Test t1(10);//调用构造函数
Test t2(20);//调用构造函数
t1.show();//调用成员函数
t2.show();//调用成员函数

}

上述程序中,成员函数show的形参与类的私有数据同名了,在执行data=data的时候,程序并不知道如何赋值,程序的执行结果会发生错误,那么如何进行修改呢?一种方法是将形参的名称修改,保证其不与私有数据同名即可;另外一种方法则是加入this指针,这里我们先给出修改后的程序,然后再做解释。

#include<iostream>
using namespace std;
class Test
{
public:
Test(int data)//构造函数,形参与私有数据同名
{
this->data=data;
}
void show()//成员函数
{
cout<<data<<endl;
}
private:
int data;
};
int main()
{
Test t1(10);//调用构造函数
Test t2(20);//调用构造函数
t1.show();//调用成员函数
t2.show();//调用成员函数

}

这个时候,程序能够正常的运行,并输出正确的结果,这是什么原因呢?我们在通过对象调用成员函数的时候:t1.show();该函数会被改写为show(&t),因此,调用该函数会传递一个地址给形参,但是我们看到的show函数并没有形参,这是怎么回事呢?原来成员函数在定义的时候,都会有一个默认的形参,在本程序中,形参为Test *const this;因此,show函数实际为:void show(Test *const this);this指针用来接受t1对象的地址,this->dada=data;自然就是用10来给this所指向的对象的data赋值。我们知道成员函数必须由对象来进行调用,我们可以这么理解,在用对象调用成员函数的时候,都会向成员函数传递一个地址(对象的地址),因此,我们在程序中看到的成员函数的形参都含有一个this指针(程序没有显示的写出来),例如:

void show()应该是:void show(Test *const this);因此,我们表面上看到的成员函数形参的个数比实际形参的个数少一个。假设我们已经定义了Student类,包含以下的成员函数:

void show();

void caculate(int a,int b,int c);

在程序内部,该函数实际为:

void show(Student *const this);

void caculate(Student *const this,int a,int b,int c);

假设在用对象调用上述两个成员函数:

stu1.show();

stu.caculate(10,20,15);

在程序内部该调用形式会被改写为:

show(&stu1);

show(&stu1,10,20,15);

由上可知,成员函数中都含有this指针,且形式为:类名 *const this;位于成员函数的第一个形参的位置。在用对象调用成员函数的时候,第一个参数即为对象的地址。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值