• 对象模型和this指针(个人学习笔记黑马学习)


    1、成员变量和成员函数

    1. #include
    2. using namespace std;
    3. #include
    4. //成员变量和成员函数分开存储
    5. class Person {
    6. int m_A;//非静态成员变量 属于类的对象上的
    7. static int m_B;//静态成员变量 不属于类的对象上
    8. void func() {} //非静态成员函数 不属于类的对象上
    9. static void func2(){}//静态成员函数 不属于类的对象上
    10. };
    11. int Person::m_B=0;
    12. void test01() {
    13. Person p;
    14. //空对象占用内存空间为:1
    15. //c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
    16. //每个空对象也应该有一个独一无二的内存地址
    17. cout << "size of p = " << sizeof(p) << endl;
    18. }
    19. void test02() {
    20. Person p;
    21. cout << "size of p = " << sizeof(p) << endl;
    22. }
    23. int main() {
    24. //test01();
    25. test02();
    26. system("pause");
    27. return 0;
    28. }


    2、this指针的用途

    1. #include
    2. using namespace std;
    3. #include
    4. class Person {
    5. public:
    6. Person(int age) {
    7. //this指针指向 被调用的成员函数 所属的对象
    8. this->age = age;
    9. }
    10. Person& PersonAddAge(Person &p) {
    11. this->age += p.age;
    12. //this指向p2的指针,而*this指向的就是p2这个对象本体
    13. return *this;
    14. }
    15. int age;
    16. };
    17. //1、解决名称冲突
    18. void test01() {
    19. Person p1(18);
    20. cout << "p1的年龄为:" << p1.age << endl;
    21. }
    22. //2、返回对象本身用*this
    23. void test02() {
    24. Person p1(10);
    25. Person p2(10);
    26. /*p2.PersonAddAge(p1);
    27. cout << "p2的年龄为:" << p2.age << endl;*/
    28. //链式编程思想
    29. p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
    30. cout << "p2的年龄为:" << p2.age << endl;
    31. }
    32. int main() {
    33. //test01();
    34. test02();
    35. system("pause");
    36. return 0;
    37. }

    3、空指针访问成员函数

    1. #include
    2. using namespace std;
    3. #include
    4. class Person {
    5. public:
    6. void showClassNmae() {
    7. cout << "this is Person class" << endl;
    8. }
    9. //报错原因是因为传入的指针是为NULL
    10. void showPersonAge() {
    11. if (this == NULL) {
    12. return;
    13. }
    14. cout << "age = " << m_Age << endl;
    15. }
    16. int m_Age;
    17. };
    18. void test01() {
    19. Person* p = NULL;
    20. p->showClassNmae();
    21. //p->showPersonAge();报错
    22. }
    23. int main() {
    24. test01();
    25. system("pause");
    26. return 0;
    27. }

    4、const修饰成员函数

    常函数:

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

    常对象:

    • 声明对象前加const称该对象为常对象
    • 常对象只能调用常函数
    1. #include
    2. using namespace std;
    3. #include
    4. //常函数
    5. class Person {
    6. public:
    7. //this指针的本质 是指针常量 指针的指向是不可以修改的
    8. //const Person * const this;
    9. //在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
    10. void showPerson() const{
    11. this->m_B=100;
    12. //this->m_A = 100;//this指针是不可以修改指针的指向的
    13. //this = NULL;
    14. }
    15. void func() {
    16. }
    17. int m_A;
    18. mutable int m_B;//特色变量,即使在常函数中,也可以修饰这个值
    19. };
    20. void test01() {
    21. Person p;
    22. p.showPerson();
    23. }
    24. //常对象
    25. void test02() {
    26. const Person p;//在对象前加const,变为常对象
    27. //p.m_A = 100;
    28. p.m_B = 100;//m_Bs是特殊值,在常对象下也可以修改
    29. //常对象只能调用常函数
    30. p.showPerson();
    31. //p.func();//常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性
    32. }
    33. int main() {
    34. test01();
    35. test02();
    36. system("pause");
    37. return 0;
    38. }

  • 相关阅读:
    Webapck 解决:[webpack-cli] Error: Cannot find module ‘vue-loader/lib/plugin‘ 的问题
    windows修改默认端口3389
    【ES6】
    解决cardano 交易“1.344798 Not enough funds for ”问题
    C:warning: null argument where non-null required (argument 2) [-Wnonnull]
    vue的子组件
    apt和dpkg的源码下载链接
    手机USB共享网络是个啥
    VBA技术资料MF72:利用函数判断文件及工作表存在
    linux备份系统盘
  • 原文地址:https://blog.csdn.net/m0_59848857/article/details/132649887