这篇文章有助于理解类与对象。类是一种类型,而对象则是一种类型的具体的东西了,即对象是要分配内存的。下面看一下很简单的例子
#include <stdio.h>
#include <stdlib.h>
#include <memory>
class CTest
{
public:
CTest(): mValue(100)
{
printf("constructor\n");
}
~CTest()
{
printf("destructor\n");
}
void printValue() const
{
printf("mValue = 100\n");
}
int getValue() const
{
return mValue;
}
private:
int mValue;
};
int main()
{
CTest *test = nullptr;
test->printValue();
return 0;
}
咋一看会不会觉得有问题,指针 test = nullptr,居然还调用成员函数 printValue(),平时我们使用的指针在使用前都要进行一下判断 if(ptr != nullptr) 。那上面这样用会不会出现段错误呢?
函数正常调用,没有出现崩溃。为什么呢?我们用 gdb 跟踪一下:
我们可以看到当调用成员函数 printValue() 的时候,传递进来的 this 是 0,然而我们在函数里并没有用到这个 this 指针,即没有用到这个对象的数据,所以不会崩溃。如果我们用到了数据那肯定会出现段错误,printValue() 函数改成如下,结果必定崩溃。
void printValue() const
{
printf("mValue = %d\n", this->mValue);
}
我们要理解类的非 static 成员函数,它都会有一个 this 指针,这个 this 就是具体的对象。而这些函数只是一个“模板”,它们做的动作都是一样的,不一样的是传递过来的 this。它们是类的一部分,不属于某个对象,所以不管对象有没有,它们是已经存在的,它们是存储于一个程序内存模型里的文本段。