C++中的this指针

C++中的this指针

 

       在C++中指针this有着极其重要的作用,但却又把自己隐藏起来,默默付出的存在,不显山,不露水,深藏功与名。在C++的类中实际上到处都有this的身影(实际上在现在的编程语言中不乏类似的存在,例如:Python中的self),从成员变量到成员函数到参数列表(是的,连参数列表中它都存在,只是它在这里是以隐藏参数的身份存在的),每一个角落它都存在,而且都发挥着重要的作用。

       this指针是什么?它是一种特殊的指针,指向的是对象本身。知道了基本的定义后,接下来让我们一层层的去剥开它那厚厚的面纱,更深入的了解它的本真。

       首先我们来看一个this指针的简单应用,假设在某个类A中的某个成员函数F(),该函数的形参和类A的成员变量同名:

class A
{
    int aa; 
    void F(int aa){ this->aa=aa; }
}

在这里使用的this->aa=aa;就能够很好的分别出是类A中的aa还是成员函数中的aa。其实类似的我们还可以使用域运算符 :: 。

       其次我们将目光聚集在类的成员函数上,看起来一切都很普通的样子,没什么特别的。但有一点是表现的相对较为特别的,如果你了解对象的数据存储结构的话,你应该能够

注意到一点。在类实例化的过程中,每个对象都会实例化出自己的成员变量,但成员函数并不会。对象在内存空间中是分区域存储的,包括一下五个存储区域:堆区(主要存放函

数参数,局部变量的值)、栈区(主要储存由程序员自己申请的数据)、全局区(储存全局变量和静态变量)、文字常量区(储存常量字符串)、二进制代码区(储存函数的二进

制代码)。由同一个类实例化的所有对象共用相同的二进制代码区,简单来说就是代码只有一份,但对象有多份,每个对象调用成员函数却能操纵自己的数据成员,这就是this的

功劳啦。在成员函数的函数头的参数列表中,this指针作为隐藏参数存在:

class A
{
    int a; 
    void F(A* this, int aa){ this->a=aa; }		//注意,这里多了参数: A* this
}

其实每一个成员函数都是被this指针指向的,我们不需要是因为编译器统一处理了,也就是对我们隐藏了。

接着还有一个常用方式是我们常用的,在对象调用成员方法的时候,有时候我们会连续调用,能够连续调用是因为上一次调用返回的是当前对象本身的引用:

class A
{
    int a; 
    A& F(A* this, int aa){ this->a=aa; return *this; }		//注意,这里改变了函数的返回值
    // A F(A* this, int aa){ this->a=aa; return *this; }	//注意本段代码与上段代码的区别
}

最后还有一种情况下,也有this指针的身影,常成员函数: func()const

class A
{
    int a; 
    const A& F(int aa){ a=aa; return *this; }
    const A& F(int aa)const{ a=aa; return *this; }		
    //此处实际的代码应该是:
    // A& F(const A* this, int aa){ this->a=aa; return *this; }	
}

我们知道常成员函数是不能改变成员变量的值的,其实本真就是因为对类成员的赋值操作是需要借由this指针来实现的,此时指this针指是一个常指针。还有一点要指出的是const A& F(int aa){ a=aa;return *this; }和const A& F(int aa)const{ a=aa; return *this; }这两个函数是互为重载的,因为它们的参数列表实际上是不同的,虽然看起来好像一样,但编译器编译后就不一样了。      但在使用的时候需要注意的是只有常对象才能调用常成员函数,因为只有这时this指针才指向了一个常对象,和参数列表相匹配。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值