C++ 类和对象(四)对象模型和this指针
C++ 类和对象(四)对象模型和this指针
文章目录
- C++ 类和对象(四)对象模型和this指针
- 成员变量和成员函数分开存储
- this指针概念
- 空指针访问成员函数
- const 修饰成员函数
1. 成员变量和成员函数分开存储
C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
空对象占用的内存空间为: 1
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占用内存的位置
每个空对象也应该有独一无二的内存地址
虽然是空对象,也不能跟别人占用同样的位置
2. this指针概念
每个非静态成员函数只有一份函数实例, 即多个同类型的对象共用一块代码
这个代码是如何区分是哪个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
(即调用这个函数的对象)
- this指针是隐含在每一个非静态成员函数内的一种指针
- this指针不需要定义, 直接使用即可
this指针的用途:
• 当形参和成员变量同名时, 可以用this指针来区分
• 在类的非静态成员函数中返回对象本身,return *this
class Person {
public:
Person(int age)
{
//形参和成员变量同名时候,可以用this 来区分
//age = age;
this->age = age;
}
//返回自身
Person& personAddPerson(Person p)
{
this->age += p.age;
return *this;
}
int age;
};
void func()
{
Person p(10);
cout << "age is : " << p.age << endl;
}
void func1()
{
Person p(10);
Person p1(10);
//p.personAddPerson(p1);
p.personAddPerson(p1).personAddPerson(p1).personAddPerson(p1);//链式编程思想
cout << "result is :" << p.age << endl;
}
区分同名参数
返回对象本身
3. 空指针访问成员函数
C++中空指针也可以调用成员函数,但是也要注意有没有用到this指针
如果用到了this指针,就需要加以判断保证代码的健壮性
class Person {
public:
void showAge()
{
//提高代码的健壮性
if (this == NULL)
{
return;
}
cout << "age is : " << m_age << endl;//this->m_age
}
int m_age;
};
void func()
{
Person *p = NULL;
p->showAge();
}
this 是一个空指针,就是一个空的对象,怎么访问到对象的成员变量
4. const 修饰成员函数
常函数:
• 成员函数后面加 const 后我们称为该函数为常函数
• 常函数内不可以修改成员属性
• 成员属性声明时候加关键字mutable后,在常函数中依然可以修改
常对象:
• 声明对象前加const称该对象为常对象
• 常对象只能调用常函数
this指针的本质:指针常量
Person * const this :
指针是不可以修改的 [this 的本质] ——>>> 指针不能指向别的对象,也不能指向空指针
this指针本来是指针常量,一旦指向了某个对象,就不能再指向另外的对象
const Person * const this:
指针指向的值也不可以修改 —>>>> void showPerson() const
在成员函数后面加 const , 修饰的是this的指向, 让指针指向的值也不可以修改
指针的指向是不可修改的
class Person {
public:
//Person * const this;
void func0() const
{
//m_a = 100; //错误, 常函数内不能修改成员变量
m_b = 100;
}
void func3()
{
}
int m_a;
mutable int m_b;//加 mutable 后 常函数可以修改
};
void func2()
{
const Person p;
//p.m_a = 100; //报错, 常对象不能修改成员变量
p.m_b = 100;
//p.func3(); //报错, 常对象不能调用普通函数, 常对象不能修改其中的变量
//而普通函数可以修改变量
}
还没有评论,来说两句吧...