有个问题是刚开始学习C++的人都想知道的,那就是C++的类对象的大小是多少?可能的猜测是它所有数据成员的大小加上所有函数指针的大小,这样就是类的大小。我们来测试一下:
#include<iostream>
using namespace std;
class A
{
public:
A();
~A();
void setA(int a, int b, int c);
private:
int a;
int b;
char c;
};
A::A()
{
}
A::~A()
{
}
void A::setA(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
class B
{
public:
B();
~B();
void setB(int a, double b, double c);
private:
int z;
double x;
double y;
};
void B::setB(int a, double b, double c)
{
this->z = a;
this->x = b;
this->y = c;
}
B::B()
{
}
B::~B()
{
}
int main()
{
A a;
B b;
cout << "对象a的大小:" << sizeof(a) << endl;
cout << "对象b的大小:" << sizeof(b) << endl;
return 0;
}
测试结果如下:
这个大小看起来就是数据成员放在结构体中的大小。依然采用内存对齐。这说明函数成员和数据成员是分开存储的。
那么C++类的函数成员是怎么确定是哪一个对象在调用它?
为了解决这个问题,C++设计了一个叫做this指针的东西。它能帮助成员函数知道谁在调用它。
this指针存放着当前对象的地址,也就是this指针指向当前对象。可以使用它来返回对象本身。
this指针不是对象的成员。
this指针只能在成员函数内部使用,类外以及成员函数外部都不能使用。
this指针是普通成员函数的一个隐藏参数。
注意:类的静态成员函数不具备this指针。这样就限制了静态成员函数的功能。使得错误降低。
显然,有了this指针做为函数的隐藏参数,函数自然而然就知道是哪一个对象在调用它。就能正确使用相应对象的成员。
this指针的另外一个附加功能就是当类数据成员和类的函数参数名称一致的时候,使用this指针可以避免混淆。就像下面代码中的一样。
void A::setA(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}