当某一个类被创建的时候,它在内存空间中是怎样分配的?
- 在栈区开辟一块空间,存放当前对象的指针在堆区开辟一块空间,并且使上一步在栈区申请的指针指向当前这一块区域
如果某一个类实例化了多个对象,在创建的时候是将类里面的所有东西全部重新复制一次吗?
不是,在同一类的多个对象创建的时候,在新的对象上面只会开辟新的空间存放这些对象的属性,而类中的方法(函数),会共用一块区域,所以,每个对象的内存空间中,存在的东西实际上只有他们的属性,与函数的空间不共存
问题来了,当这些不同的对象调用同一个函数的时候,怎么判断当前是哪一个对象调用了目前这个类的方法?
引入this指针
this指针指向当前类所作用的对象,因为对象是由类实例化出来的,所以当对象去调用类的方法的时候,需要分辨当前到底是哪个对象调用了这个方法,this指针就发挥了这样的作用,指向当前作用的对象,使类知道是哪个对象在调用这个方法
为什么下面这段程序还能正常输出 hello 的结果?
Q:这个A类型的指针都指向空了,怎么找到这个函数的
A:非静态成员函数的形参实际上会多出来一个,这个就是 this,这个形参是编译器自己加上去的,也可以手动写上去,没有手动写的时候就会自己加上去,用于指向当前调用这个成员函数的对象,这样一来,就可以找到当前正在调用成员函数的那个对象了
#includeusing 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)