this指针详解

来源:互联网 发布:吃喝玩乐软件哪个好 编辑:程序博客网 时间:2024/06/02 06:23

首先我们来看一段简单的代码:

class A{public:    void set(string name, int age)    {        Name = name;        Age = age;    }private:    string Name;    int Age;};int main(){    A a1, a2;    a1.set("zhangsan", 18);    a2.set("lisi", 9);    return 0;}

观察上面的这一段代码,这里有一个疑问:函数怎么知道哪一个对象需要被操作呢?
大家肯定都知道:当然是this指针在中间发挥作用咯!

下面我们来总结一下this指针的有关知识:

一.有一段经典的话就是用来描述this指针的:

当你进入一个房子后,   
你可以看见桌子、椅子、地板等,   
但是房子你是看不到全貌了。   
对于一个类的实例来说,   
你可以看到它的成员函数、成员变量,   
但是实例本身呢?   
this是一个指针,它时时刻刻指向你这个实例本身。
看完这段话想必大家都已经明白了this指针是什么了吧。

二.this指针的特性

1.this指针是在什么时候构造的
this指针在成员函数开始前构造,在成员函数结束后消除。但是this指针并不属于对象,因此当用sizeof求对象大小的时候,并没有把this指针的大小算进去。
有细心的同学会发现,如果没有成员函数,那还有没有this指针呢?有,当然有!当一个类中没有了方法,这个类也就没有构造函数,这个class类就相当于c语言中的结构体。那么this指针指向的就是这块空间。

2.this指针的作用对象
this指针作用的是非static的成员函数,当然也不能是全局函数。为什么?因为this指针存在于类的成员函数中,指向被调用的成员函数的所在的实例。static函数属于类,但并不属于某一个具体对象。全局函数就更不必说了,它不属于类。由此可知,我们在成员函数外部是无法访问this指针的。

3.this指针成员函数中是以什么形式存在的
上文说this指针存在于类的成员函数中,那么它究竟是如何存在的?实际上,this指针是以隐含参数的形式传入成员函数里的(编译器会自动完成)。
比如类中的一个函数 void add(int x,int y);
而实际上它的参数列表是这样的 void add(A* const this,int x,int y);(A是类名)
因此this指针的生存周期和函数的参数一样长。

4.this指针如何传递参数
在调用函数之前,如果函数的参数个数一定,this指针通过ecx寄存器传递参数,否则,等所有函数参数压如栈中以后,this指针才被压入堆栈。

5.this指针的使用
它可以在非静态成员函数的内部使用。
它不可以在构造函数的初始化列表中使用,因为在初始化列表中,对象的构建还未完成,尚不可得知对象的内部结构,无法通过this对其进行访问。

三.this指针的使用

看一段代码:

class A{public:    A()    {        a = b = 0;    }    A(int i, int j)    {        a = i;        b = j;    }    void copy(A&aa);    void print()    {        cout << a << "," << b << endl;    }private:    int a;    int b;};void A::copy(A&aa){    if (this == &aa)return;    *this = aa;}int main(){    A a1, a2(3,4);    a1.copy(a2);    a1.print();    return 0;}

在成员函数copy()中出现两次this指针,copy的具体作用是把对象a2拷贝给对象a1,this的作用在于判断要拷贝给的对象是不是自己本身。*this表示this指向的这一块空间,即对象a1,用来接收a2的内容。

0 0
原创粉丝点击