this指针

this指针,第1张

this指针

当某一个类被创建的时候,它在内存空间中是怎样分配的?

    在栈区开辟一块空间,存放当前对象的指针在堆区开辟一块空间,并且使上一步在栈区申请的指针指向当前这一块区域

如果某一个类实例化了多个对象,在创建的时候是将类里面的所有东西全部重新复制一次吗?

不是,在同一类的多个对象创建的时候,在新的对象上面只会开辟新的空间存放这些对象的属性,而类中的方法(函数),会共用一块区域,所以,每个对象的内存空间中,存在的东西实际上只有他们的属性,与函数的空间不共存

问题来了,当这些不同的对象调用同一个函数的时候,怎么判断当前是哪一个对象调用了目前这个类的方法?

引入this指针

this指针指向当前类所作用的对象,因为对象是由类实例化出来的,所以当对象去调用类的方法的时候,需要分辨当前到底是哪个对象调用了这个方法,this指针就发挥了这样的作用,指向当前作用的对象,使类知道是哪个对象在调用这个方法

为什么下面这段程序还能正常输出 hello 的结果?
Q:这个A类型的指针都指向空了,怎么找到这个函数的
A:非静态成员函数的形参实际上会多出来一个,这个就是 this,这个形参是编译器自己加上去的,也可以手动写上去,没有手动写的时候就会自己加上去,用于指向当前调用这个成员函数的对象,这样一来,就可以找到当前正在调用成员函数的那个对象了

#include 
using namespace std;
class A
{
    int i;
public:
    void Hello()
    {
    	cout << "hello" << endl; 
    }
};
int main()
{
    A* p = NULL;
    p -> Hello();
}

在C++刚推出的时候,编译的方式采用的是先翻译成 C 程序,然后编译执行,而这个this指针在其中就起到了重要作用

下面这个例子:
当某个函数的形参和类本身属性重名,怎么让编译器分辨出到底需要的是哪一个 i ?
使用 this指针 ,this指针指向的是当前正在起作用的那个对象,而这个对象里面自带的就是类原本的属性 i ,所以就可以找到对应的 i ,

class A
{
	public int i = 0;
	public A()
	{
		
	}
	public void f(int i)
	{
		System.out.printf("%dn",i);
		System.out.printf("%dn",this.i);
	}
}

public class sStart
{
	public static void main(String[] args)
	{
		A a1 = new A();
		a1.f(5);
	}
}

输出结果为:
5
0

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5711452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存