目录
隐藏的this指针
● 对于类的非静态成员,每一个对象都有自己的一份拷贝, 即每个对象都有自己的数据成员, 不过成员函数却是每个对象共享的。 那么调用共享的成员函数是如何区分自己的的数据成员呢,答案就是通过类中隐藏的this 指针。
● this 指针是隐含在每个类成员函数中的指针, 其指向正在操作此函数的类对象,其类型为当前类类型的指针类型,在const函数中, 为当前类类型的const指针类型。 this指针的作用域是在类内部, 当在类的非静态成员函数中访问类的非静态成员时, 编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
● 注意: 类的静态成员函数中没有this指针
void func(void *p, int val);
class A
{
public:
int getA()
{
return a;
}
void setA(int val);
friend void func(void *p, int val);
private:
int a;
};
void func(void *p, int val)
{
A *pp = (A*)p; 得到对象指针
pp->a = val;
}
void A::setA(int val)
{
func(this, val); 调用全局函数,this 表示当前对象指针
}
int main()
{
A aa;
aa.setA(500);
int x = aa.getA();
cout << "输出x的值:" << x << endl;
system("pause");
return 0;
}
在调用函数func时第一个参数是this 指针, 表明将对象aa 的指针传入 func中,然后通过对象aa 改变其中的成员变量a的值。
通过对象aa 调用setA() 函数, 在该函数的内部,this指针持有aa 对象的地址。 以这样的方式, 成员函数可以访问对象内的任何元素。
this指针将作为隐藏的参数传递给每个成员函数, 且this指针通常是函数接受的第一个参数、其后是已声明的其他参数, 假定setA() 函数如下:
void setA(A *this,int val);
在调用该函数时,应该这样:
aa.setA(&aa,500);
● 成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象。 当我们调用一个成员函数时,用请求该函数的对象地址初始化this。 例如, 如果调用
aa.getA()
则编译器负责把 aa 传递给了 getA()
函数的隐式形参this.
● 隐藏的this 指针应该注意的问题
this指针不能被修改,因为它是个常量指针。绝不能给它赋值,需要在成员函数内部修改this指针的情况很少见
返回 *this 指针表示把该指针指向的对象当作一个整体返回, 而非访问该对象中的某个成员。
什么时候必须使用this指针
利用this指针去除歧义的时候。
当我们希望返回对调用某函数的对象的引用时, 必须使用*this。
另一种情况是: 我们希望获得对象的地址,也必须显式使用this 指针。