this指针详解

什么是this指针?

当我们进入一个房子之后,可以看见房子里的电视、灯、花草等,但是看不到房子的全貌。对于一个类的实例来说,

你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向这个实例

具体说明:

在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配

有自己独立的存储空间。如果对同一个类定义多个对象,则有多个同样大小的空间存放对象中的数据成员,

对于成员函数来说,一个函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,

其实它们调用的是同一段函数代码

    那么,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员

        而不是其他对象的数据成员呢? 

         答案就是:this指针

每一个非静态成员函数中都包含一个this指针

例子:

class A
{
public:
	void set(int x)
	{
		this->a = x;
	}
	void print()
	{
		cout << "this" << this << endl;
	}
private:
	int a;
};
int main()
{
	A a1;
	cout << "&a1=" <<&a1<< endl;
	a1.print();
	system("pause");
	return 0;
}

 运行结果为:

这个例子这就说明this指针记录的是当前对象的内存地址,也就是this指针指向当前对象

在调用成员函数时,系统隐式地将对象的起始地址传递给成员函数,使this指针得到当前对象的地址。

于是在成员函数中对数据成员的引用,就按照this的指向找到对象的数据成员,实现对数据成员的操作。

也就是说, 成员函数中数据成员名的前面隐含有“this->” 的指向。

class Test
{
public:
	Fun(int a)
	{
		//doSomething
	}
private:
	int a;
};

其实这个Fun函数里面有两个参数  Fun(Test* const this,int a);

this指针特性:

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

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

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

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

    5.传递,类编写者不能显式传递

    6.只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以

    7.存储类型:this指针是由编译器生成的,当类的非静态成员函数的参数个数一定时

       this指针存储在ecx寄存器中,调用——thiscall约定。若该函数参数个数未定(可变参数)存放在栈中

        调用_cdecl.

注意:

    1.this指针不能为空

    2.为什么使用的是指针,而不是引用?

        this指针的类型和类引用的类型都是Test* const但是,由于历史原因,C++最初是没有引用,而有指针的,

        在设计类时,就采用了指针的方式,就导致了现在的局面。虽然引用理论上也可以实现this的功能。

  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值