Jamzy Wang

life is a struggle,be willing to do,be happy to bear~~~

C/C++ 中的this指针

2012-06-14 21:49

原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许可,欢迎转载,演绎,但是必须保留本文的署名(包含链接),且不得用于商业目的。

每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了若干个个对象,则有若干组同样大小的空间以存放这些对象中的数据成员。但是,不同对象都调用同一个函数代码段,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:
    A(int a)
    {
        var = a;
    };
    void print_1()
    {
        cout << var << endl;
    }
private:
    int var;
};
1
2
3
4
5
6
7
int main(int argc, char const *argv[]) {
    A a(10);
    A b(20);
    a.print_1();
    b.print_1();
    return 0;
}

运行上述代码程序将输出:

1
2
10
20

a.print_1()和b.print_1()调用的是同一个函数,那么为什么a.print_1()会调用a的成员变量var,b.print_1()会调用b的成员变量var?

在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针,this是C++中的一个关键字,也是一个常量指针。它是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。通过 this,可以访问当前对象的成员变量和成员函数。

下面的语句中,this 就和 &a 的值是相同:

此处输入图片的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
public:
    A(int a)
    {
        var = a;
    };
    void this_value()
    {
        cout << this << endl;
    }
    void print_var_1()
    {
        cout << var << endl;
    }
    void print_var_2(int var)
    {
        cout << var << endl;
        cout << this->var << endl;
    }
private:
    int var;
};
1
2
3
4
5
6
7
8
int main(int argc, char const *argv[]) {
    A a(10);
    a.this_value();
    cout << &a << endl;
    a.print_var_1();
    a.print_var_2(20);
    return 0;
}

this指针是隐式使用的,它是作为参数被传递给成员函数的。

假设,成员函数return_var()的定义如下:

1
2
3
4
int return_var()
{
    cout << var << endl;
}

C++编译器把它处理为:

1
2
3
4
int return_var(A *this)
{
    cout << this->var << endl;
}

即在成员函数的形参表列中增加一个this指针。在调用该成员函数时,实际上是用以下方式调用的:

1
a.return_var(&a);

将对象a的地址传给形参this指针。然后按this的指向去引用其他成员。

需要说明: 这些都是编译系统自动实现的,编程序者不必人为地在形参中增加this指针,也不必将对象a的地址传给this指针。在需要时也可以显式地使用this指针。

在成员函数print_var_2(int var)中

1
2
3
4
5
void print_var_2(int var)
{
    cout << var << endl;
    cout << this->var << endl; //cout << (*this).var << endl;
}

cout << var << endl 语句里的var变量调用的是输入参数var,也就是20; this->var 输出的是对象a的成员变量的值,也就是10;

总结几点:

1) this 是常量指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。

2) this 只能在成员函数内部使用,其他地方没有意义,也是非法的。

3) 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。

4) this 指针是作为函数的参数隐式传递的,this 指针并不出现在参数列表中。

调用成员函数时,系统自动获取当前对象的地址,赋值给 this,完成参数的传递,无需用户干预。

5)this 只是隐式参数,不在对象的内存空间中,创建对象时也不为 this 分配内存, 只有在发生成员函数调用时才会给 this 赋值,函数调用结束后,this 被销毁。

Comments