C++ 类和对象(四)对象模型和this指针

快来打我* 2022-12-22 04:56 198阅读 0赞

C++ 类和对象(四)对象模型和this指针

文章目录

  • C++ 类和对象(四)对象模型和this指针
      1. 成员变量和成员函数分开存储
      1. this指针概念
      1. 空指针访问成员函数
      1. const 修饰成员函数

1. 成员变量和成员函数分开存储

C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上

空对象占用的内存空间为: 1
C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占用内存的位置
每个空对象也应该有独一无二的内存地址

虽然是空对象,也不能跟别人占用同样的位置

2. this指针概念

每个非静态成员函数只有一份函数实例, 即多个同类型的对象共用一块代码
这个代码是如何区分是哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
(即调用这个函数的对象)

  • this指针是隐含在每一个非静态成员函数内的一种指针
  • this指针不需要定义, 直接使用即可

this指针的用途:

• 当形参和成员变量同名时, 可以用this指针来区分
• 在类的非静态成员函数中返回对象本身,return *this

  1. class Person {
  2. public:
  3. Person(int age)
  4. {
  5. //形参和成员变量同名时候,可以用this 来区分
  6. //age = age;
  7. this->age = age;
  8. }
  9. //返回自身
  10. Person& personAddPerson(Person p)
  11. {
  12. this->age += p.age;
  13. return *this;
  14. }
  15. int age;
  16. };
  17. void func()
  18. {
  19. Person p(10);
  20. cout << "age is : " << p.age << endl;
  21. }
  22. void func1()
  23. {
  24. Person p(10);
  25. Person p1(10);
  26. //p.personAddPerson(p1);
  27. p.personAddPerson(p1).personAddPerson(p1).personAddPerson(p1);//链式编程思想
  28. cout << "result is :" << p.age << endl;
  29. }

区分同名参数
在这里插入图片描述
返回对象本身
在这里插入图片描述

3. 空指针访问成员函数

C++中空指针也可以调用成员函数,但是也要注意有没有用到this指针
如果用到了this指针,就需要加以判断保证代码的健壮性

  1. class Person {
  2. public:
  3. void showAge()
  4. {
  5. //提高代码的健壮性
  6. if (this == NULL)
  7. {
  8. return;
  9. }
  10. cout << "age is : " << m_age << endl;//this->m_age
  11. }
  12. int m_age;
  13. };
  14. void func()
  15. {
  16. Person *p = NULL;
  17. p->showAge();
  18. }

在这里插入图片描述
this 是一个空指针,就是一个空的对象,怎么访问到对象的成员变量

4. const 修饰成员函数

常函数:

• 成员函数后面加 const 后我们称为该函数为常函数
• 常函数内不可以修改成员属性
• 成员属性声明时候加关键字mutable后,在常函数中依然可以修改

常对象:

• 声明对象前加const称该对象为常对象
• 常对象只能调用常函数

this指针的本质:指针常量
Person * const this :
指针是不可以修改的 [this 的本质] ——>>> 指针不能指向别的对象,也不能指向空指针
this指针本来是指针常量,一旦指向了某个对象,就不能再指向另外的对象

const Person * const this:
指针指向的值也不可以修改 —>>>> void showPerson() const

在成员函数后面加 const , 修饰的是this的指向, 让指针指向的值也不可以修改
指针的指向是不可修改的

  1. class Person {
  2. public:
  3. //Person * const this;
  4. void func0() const
  5. {
  6. //m_a = 100; //错误, 常函数内不能修改成员变量
  7. m_b = 100;
  8. }
  9. void func3()
  10. {
  11. }
  12. int m_a;
  13. mutable int m_b;//加 mutable 后 常函数可以修改
  14. };
  15. void func2()
  16. {
  17. const Person p;
  18. //p.m_a = 100; //报错, 常对象不能修改成员变量
  19. p.m_b = 100;
  20. //p.func3(); //报错, 常对象不能调用普通函数, 常对象不能修改其中的变量
  21. //而普通函数可以修改变量
  22. }

发表评论

表情:
评论列表 (有 0 条评论,198人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++d对象this指针

    一、成员变量与成员函数分开存储。 在C++中,类内的成员变量和成员函数是分开储存的,只有非静态成员变量才属于类的对象上。 \include <iostream> us