C++类与对象--3 C++对象模型和this指针
3.1 类成员分开存储
- 成员变量和成员函数在内存中是分开存储的
- 只有非静态成员变量是存储在对象上的
- C++为空对象分配1字节的空间
- 非空对象的大小为其内部非成员变量大小总和
- 静态成员不占对象空间
- 不同对象的成员函数共享一个函数实例,不占对象空间(通过this指针进行区分函数属于哪个对象)
3.2 this指针
(1)概念
- this指针的本质是一个指针常量-->指向不能改变
- this隐含在每一个非静态成员函数内
- 不需要单独定义,可直接使用
(2)用途
- 形参和成员变量同名时,使用this指针来区分(解决名称冲突)
- 非静态成员函数中返回对象本身
- 空指针可以调用成员函数,但会与this指针冲突(增加代码健壮性)
class Person
{public:int age;Person(int age){/* Person * const this */this->age = age; // 形参和成员变量同名,使用this区分// this指针指向调用本函数的对象}Person Test(){return *this; // 返回对象本身}void nullPointer(){if(this == NULL) // 增加代码健壮性{return;}}
};
3.3 const修饰成员函数
(1)常函数
- 成员函数后加const,const修饰的是this指针
- 常函数内无法修改成员属性
class Test
{public:int m_var;void func() const // 常函数,const修饰的是this指针{/* const Test * const this */this->m_var = 100; // 报错,this指向的值无法改变}
};
(2)常对象
-
声明对象前加const
-
常对象只能调用常函数,不允许修改本身的属性