loading请求处理中...

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

2021-12-02 05:48:30 阅读 9773次 标签: c#开发基础 作者: yf8488240

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

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

}

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

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

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

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

}

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

#include
using namespace std;
class Test
{
public:
Test(int data)//构造函数,形参与私有数据同名
{
this->data=data;
}
void show()//成员函数
{
cout< }
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;位于成员函数的第一个形参的位置。在用对象调用成员函数的时候,第一个参数即为对象的地址。


开发公司推荐

成为一品威客服务商,百万订单等您来有奖注册中

留言( 展开评论

快速发任务

价格是多少?怎样找到合适的人才?

官方顾问免费为您解答

 
相关任务
DESIGN TASK 更多
可视化展示工具,开发

¥1000 已有2人投标

H5小游戏开发

¥10000 已有1人投标

归寝签到软件开发

¥5000 已有1人投标

ToG业务销售拓展管理系统开发

¥20000 已有1人投标

监控工具开发

¥15000 已有0人投标

微信营销平台开发

¥20000 已有4人投标

打窝船PCBA方案开发

¥3000 已有0人投标