类的每个成员函数都有一个特殊指针------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则是对象的值。