当前位置:   article > 正文

C++对象模型和this指针

C++对象模型和this指针

一.C++对象模型

--->成员变量和成员函数时分开储存的(在C++中,类内的成员变量和成员函数分开储存,

只有非静态成员变量才属于类的对象上

--->空对象:

  1. #include <iostream>
  2. using namespace std;
  3. class Person
  4. {
  5. };
  6. void test01()
  7. {
  8. Person p;
  9. cout << sizeof(p) << endl;//1
  10. }
  11. int main()
  12. {
  13. test01();
  14. return 0;
  15. }

  1. #include <iostream>
  2. using namespace std;
  3. class Person
  4. {
  5. public:
  6. int m_A;//非静态成员变量,属于类的对象上
  7. static int m_B;//静态成员变量,不属于类的对象上
  8. void func() {};//非静态成员函数,不属于类的对象上
  9. };
  10. int Person::m_B = 0;//(类内声明,类外初始化)
  11. void test01()
  12. {
  13. Person p;
  14. cout << sizeof(p) << endl;//4
  15. }
  16. int main()
  17. {
  18. test01();
  19. return 0;
  20. }

用sizeof()计算类所占的空间时,只计算属于类的对象上的!!!!!!!!!!!!!!!!

!!!!!!!只有非静态成员变量属于类的对象上!!!!!!!

二.this指针

--->指向被调用的成员函数所属的对象

  1. //用this指针解决名称冲突
  2. #include <iostream>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. Person(int age)//有参构造函数
  8. {
  9. this->age = age;//this指针指向的是被调用的成员函数所属的对象,谁调用了这个有参构造,this指针就指向谁
  10. }
  11. int age;//成员变量与形参撞名
  12. };
  13. void test01()
  14. {
  15. Person p(18);
  16. cout << "p的年龄为:" << p.age << endl;
  17. }
  18. int main()
  19. {
  20. test01();
  21. return 0;
  22. }
  1. //返回对象本身用*this
  2. #include <iostream>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. Person(int age)
  8. {
  9. this->age = age;
  10. }
  11. Person& PersonAddAge(Person& p)
  12. {
  13. this->age += p.age;
  14. return *this;//返回本身才能实现叠加操作(链式编程思想)
  15. }
  16. int age;
  17. };
  18. void test01()
  19. {
  20. Person p1(10);
  21. Person p2(20);
  22. p2.PersonAddAge(p1);
  23. cout << p2.age << endl;//30
  24. }
  25. int main()
  26. {
  27. test01();
  28. return 0;
  29. }

--->链式编程思想:

必须要指针的指针才能对p2进行修改,否则return的只是p2的副本

三.空指针访问成员函数

(C++空指针可以调用成员函数,但要注意有没有用到this指针)

  1. //空指针访问成员函数
  2. #include <iostream>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. void showPerson()
  8. {
  9. cout << "This is Person class" << endl;
  10. }
  11. void showPersonAge()
  12. {
  13. cout << "age=" << m_Age << endl;//等价于this->m_Age
  14. }
  15. int m_Age;//非静态成员变量,属于类的对象上,编译器不知道年龄属于哪个对象
  16. };
  17. void test01()
  18. {
  19. Person* p=NULL;
  20. p->showPerson();//正常运行
  21. p->showPersonAge();//报错(原因:传入指针为空)
  22. }
  23. int main()
  24. {
  25. test01();
  26. return 0;
  27. }

--->改进:(若为空指针,直接返回,不进行访问)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/505407
推荐阅读