《C++ this指针的理解和作用.docx》由会员分享,可在线阅读,更多相关《C++ this指针的理解和作用.docx(7页珍藏版)》请在第壹文秘上搜索。
1、this指针概念在C+中,this指针是一个指向当前对象的指针。它是一个隐式参数,在成员函数内部自动被传递,以便访问该对象的成员变量和成员函数。本文将介绍this指针的概念、用法和注意事项。概念this指针是一个指向当前对象的指针。它是一个内置的指针类型,可以在类的成员函数中使用。当调用一个成员函数时,编译器会将当前对象的地址作为this指针传递给该函数。因此,通过this指针可以访问当前对象的成员变量和成员函数。用法this指针可以用于以下几种情况:区分局部变量和成员变量当成员变量和局部变量同名时,可以使用this指针来区分它们。通过this指针访问成员变量,可以确保访问的是当前对象的成员变
2、量,而不是局部变量。classMyClasspublic:voidsetX(intx)this-x=x;Jprivate:intx;J;intmain()MyClassobj;obj.setX(10);return0;)上面的代码定义了一个类MyClass,其中有一个成员变量X和一个成员函数setX。在SetX函数中,使用this指针来访问成员变量X,并将其设置为参数X的值。在main函数中创建了一个MyCIass对象obj,并调用了SetX函数来设置X的值为10。在一个对象的成员函数中返回对象本身在一个对象的成员函数中返回对象本身时,可以使用this指针来返回当前对象的地址。这样可以实现链式
3、调用。classMyClasspublic:MyClass&setX(intx)this-x=x;return*this;private:intx;);intmain()MyClassobj;obj.setX(10).setX(20);return0;)上面的代码定义了一个类MyClass,其中有一个成员变量X和一个成员函数setX。在SetX函数中,使用this指针来返回当前对象的地址,并实现链式调用。在main函数中创建了一个MyCIass对象obj,并使用链式调用两次调用SetX函数来设置X的值为10和20。注意事项this指针只能在成员函数中使用。在非成员函数中使用this指针会导致编
4、译错误。this指针是一个常量指针,不能被修改。如果试图修改this指针的值,会导致编译错误。this指针是一个隐式参数,不需要在函数调用时显式传递。因此,在调用成员函数时,不需要在参数列表中包含this指针。this指针可以用于访问当前对象的成员变量和成员函数。如果成员函数需要访问多个对象的成员变量,可以使用多个this指针来传递不同的对象地址。总结this指针是一个指向当前对象的指针,在成员函数内部自动被传递。它可以用于区分局部变量和成员变量,返回对象本身,访问当前对象的成员变量和成员函数等。但是需要注意,this指针只能在成员函数中使用,是一个常量指针,不需要显式传递,不能被修改。C+程
5、序到C程序的翻译要想理解C+的this指针,我们可以先把下面的C+代码转换成C代码:classCarpublic:intm-price;voidSetPrice(intp)/.,price=p;/将/人的Carr.,111lfzjpriceMt*为什么要加个this的指针呢?我们继续往下看。在这里我们把上面C+程序的main函数翻译C程序,是这样的:Intmai()structCarcar;SetPrice(&car,);return;所以最终把上述的C+程序转换成C程序的代码如下:所以加SetPrice函数的第一个参数this指针的作用,就是为了给结构体Car域里的变量赋值。this指针的作
6、用其作用就是指向成员函数所作用的对象,所以非静态成员函数中可以直接使用this来代表指向该函数作用的对象的指针。下面的例子可以很好的说明this的作用:/includeclassCarpublic:Intm-prlce;voidPrintPrtce()std:coutm,prtcestd:endl;voidSetPrice(Intp)thts-m,price=;/等价丁m_prtce=p;this-PrtntPrice();/PrintPrice();)CarGetCar()(return*this;/返回该相数作用的对象);intmain(void)(Carcarl,car2;carl.Se
7、tPrice(2);/carl.GetCar()返其所作用的carl对象,并把返I可的carl赋值给了car2car2carl.GetCar();car2.PrintPrice();return;输出结果:2000020000接下来我们看下面的代码,你觉得输出结果是什么呢?会出错吗?classAprivate:intt;public:voidHello()couthelloendl;;intmain()A*p=NULL;p-Hello();结果会怎样?答案是正常输出hello,你可能会好奇明明p指针是空的,不应该是会程序奔溃吗?别着急,我们先把上面的代码转换C程序,就能理解为什么能正常运行了。
8、voidHello()couthelloendl;/成员函数相当如下形式:voidHello(A*this)couthelloendl;p-Hello();/执行HeUO()形式相当于:Hello(p);所以,实际上每个成员函数的第一个参数默认都有个指向对象的this指针,上述情况下如果this指针指向的对象是空,相当于成员函数的第一个参数是NULL,那么只要成员函数没有使用到成员变量,是可以正常执行。那么下面这份代码执行时,就会奔溃了,因为this指针是空的,使用了空的指针指向了成员变量i,程序就会奔溃。classAinti;public:voidHeUo()coutihelloendl;/
9、-voidHello(A*this)coutthis-thelloendl;);intmain()A*pNULL;p-Hello();/-Hello(p);)this指针和静态成员函数静态成员函数是不能使用this指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。C+类中this指针的理解:先要理解class的意思。ClaSS应该理解为一种类型,象int,char一样,是用户自定义的类型。用这个类型可以来声明一个变量,比如intX,myclassmy等等。这样就像变量X具有血类型一样,变量my具有myclass类型。理解了这个,就好解释this了,my里的this就是指向my的指
10、针。如果还有一个变量myclassmz,mz的this就是指向mz的指针。这样就很容易理解this的类型应该是myclass,而对其的解引用this就应该是一个myclass类型的变量。通常在ClaSS定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。另外一个理解:一个学生可以有多本书一样,而这些书都是属于这个同学的;同理,如果有很多个同学在一起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在自己的书上写上名字,这样肯定就不会拿错了。同理,一个对象的多个成员就可看作是这个对象所拥有的书;而在很多
11、个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C+中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符-访问该对象的成员。1this指针的用处:一个对象的this指针并不是对象本身的一部分,不会影响SiZeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例
12、如,调用:date.SetMonth(9)SetMonth(&date,9)this帮助完成了这一转换在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址.2、this指针的使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用return*this;另外一种情况是当参数与成员变量名相同时,如this-n=n(不能写成n=n)。this指针程序示例:this指针
13、是存在与类的成员函数中,指向被调用函数所在的类实例的地址。根据以下程序来说明this指针:#includeclassPointintx,y;public:Point(inta,intb)x=a;y=b;)VoidMovePoint(inta,intb)x+=a;y=b;)Voidprint()coutx=xy=yx+=a;this-y+=b;)即可以知道,POintl调用该函数后,也就是POintl的数据成员被调用并更新了值。即该函数过程可写成:pointl.X+=a;pointl.y+=b;案例二:#includeusingnamespacestd;classAjpubliciintget()constreturni;voidset(i