this
每个对象创建后,会有个指向自己的指针常量,这个指针是this指针。
C++规定类的成员变量和成员函数分开存储,每个类对象有单独的成员变量,但是会共用成员函数。相同类的不同对象调用共用函数时,使用的成员数据是不同的,怎样分清楚呢?实际上,编译器会自动在每个非静态成员函数内部生成一个this指针。this指针指向被调函数所属的对象。this指针实现了类的封装特性,把数据和函数连接起来。
case
#include<iostream>
class C {
public:
int x=10;
int getA() { std::cout << typeid(*this).name() << std::endl; return x; }
};
class C1 : public C {
public:
int x=100;
int getB() { std::cout << typeid(*this).name() << std::endl; return x; }
};
int main() {
C1 c;
std::cout << c.getB() << std::endl;
std::cout << c.getA() << std::endl;
return 0;
}
输出的两个值是100,10
class CDocument {
public:
virtual void Serialize() {
std::cout << "CDocument Serialize" << std::endl;
}
void OnFileOpen() {
Serialize();
}
};
class CMyDoc : public CDocument{
public:
virtual void Serialize() {
std::cout << "CMyDoc Serialize" << std::endl;
}
};
int main() {
CMyDoc doc;
doc.OnFileOpen();
return 0;
}
输出的结果是:CMyDoc Serialize
每个类的每个非静态成员函数都会有一个默认的class* this参数。在对象调用函数时,会默认加上&object。
对于1,getA()会得到C1类的对象c的地址,但是会向上转换为C类,取得C的成员变量x;
对于2,和1一样,发生了多态。