本文已参与「新人创作礼」活动,一起开启掘金创作之路。
当某一个类被创建的时候,它在内存空间中是怎样分配的?
- 在栈区开辟一块空间,存放当前对象的指针
- 在堆区开辟一块空间,并且使上一步在栈区申请的指针指向当前这一块区域
如果某一个类实例化了多个对象,在创建的时候是将类里面的所有东西全部重新复制一次吗?
不是,在同一类的多个对象创建的时候,在新的对象上面只会开辟新的空间存放这些对象的属性,而类中的方法(函数),会共用一块区域,所以,每个对象的内存空间中,存在的东西实际上只有他们的属性,与函数的空间不共存
问题来了,当这些不同的对象调用同一个函数的时候,怎么判断当前是哪一个对象调用了目前这个类的方法?
引入this指针
this指针指向当前类所作用的对象,因为对象是由类实例化出来的,所以当对象去调用类的方法的时候,需要分辨当前到底是哪个对象调用了这个方法,this指针就发挥了这样的作用,指向当前作用的对象,使类知道是哪个对象在调用这个方法
为什么下面这段程序还能正常输出 hello 的结果? Q:这个A类型的指针都指向空了,怎么找到这个函数的 A:非静态成员函数的形参实际上会多出来一个,这个就是 this,这个形参是编译器自己加上去的,也可以手动写上去,没有手动写的时候就会自己加上去,用于指向当前调用这个成员函数的对象,这样一来,就可以找到当前正在调用成员函数的那个对象了
#include <iostream>
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("%d\n",i);
System.out.printf("%d\n",this.i);
}
}
public class sStart
{
public static void main(String[] args)
{
A a1 = new A();
a1.f(5);
}
}
输出结果为: 5 0