OOP学习笔记二:识别成员函数的目标对象------this指针

版权声明:转载请注明出处 https://blog.csdn.net/weixin_40501169/article/details/87804474

类的每个成员函数都有一个特殊指针------this。this指针内含调用成员函数的对象的地址(即this指针总是指向目标对象)

this指针只在函数内部有效。

普通成员函数声明如下:

void NodesHelper::init(){
cout<<endl<<"Input Section START from NodesHepler#####"
       <<endl;
   cout<<"Enter length in x axis";
   cin>>_lenx;
}

this指针的类型是”指向成员函数所属类的指针“,所以this的类型应该是类名。

编译器在处理类的成员函数时会进行名称重整(name mangling)以确保其唯一性,对于非静态成员函数来说,this一般都是其第一个参数。上普通成员函数如果想要显示声明this如下
 

void NodesHelper::init(const NodesHelper* this){
   cout<<endl<<"Input Section START from NodesHepler#####"
       <<endl;
   cout<<"Enter length in x axis";
   cin>>_lenx;
}

实际上,this指针的声明在已重整函数名中可见。因此NodesHelper::init()应该是

void init_11NodesHelperFv(const NodesHelper* this){
   cout<<endl<<"Input Section START from NodesHepler#####"
       <<endl;
   cout<<"Enter length in x axis";
   cin>>this->_lenx;
}

很明显函数名重整为init_11NodesHelperFv了,重整后的init为原始函数名,数字代表类名的长短F表明该函数为全局函数,v表明该函数不接受任何参数(void)。一旦离开成员函数,this名称将不再有效。其中数据成员也被this引用。

但并不是所有情况都要使用this指针来引用目标对象中的成员,只有在成员函数使用该类成员(数据成员或成员函数)的非限定(unqualified name)名时,才意味着使用this指针。如果在成员函数内部引用类的成员,编译器会在每条表达式中均插入this指针(如果用户没有这么做)。

this->_lenx表达式使用this指针显示访问数据成员,该表达式的意思是:this指针指向该对象中的_lenx数据成员。this指针只是成员函数的一个参数(但存在一些限制,将在其他地方讨论,可以像使用成员函数的其他参数那样使用this指针。

在如下代码段中

NodesHelper helper;
helper.init();

对象helper调用init(),即像对象helper发送init()消息,在init()函数中this指针将指向helper。

由于this是指向对象的指针,因此,如果要使用this指针获得整个对象,我们必须使用*操作符对this指针解引用(de-reference)为*this。正如其他指针那样,this内部存放的是对象的地址,*this则是对象的值。

猜你喜欢

转载自blog.csdn.net/weixin_40501169/article/details/87804474