this指针详解

本文详细解析了C++中的this指针概念及其工作原理,包括this指针的构造时机、作用对象、存在形式及使用限制等内容。

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

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的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值