• c++——.类的访问限定符,类的定义,类/对象的大小计算,this指针


    一.类的访问限定符

    1 访问限定符 C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其 接口提供给外部的用户使用。

    2.访问限定符的说明 

    (1). public修饰的成员在类外可以直接被访问

    (2.) protected和private修饰的成员在类外不能直接被访问。

    (3). 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

    (4). 如果后面没有访问限定符,作用域就到 } 即类结束。

    (5). class的默认访问权限为private,struct为public(因为struct要兼容C)

    (6).访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

    3.C++中struct和class的区别是什么?

    答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和 class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是 private。

    二.类的定义

    1.class为定义类的关键字,{}中为类的主体,注意类定义结束时后面分号不能省 略。 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

    1. class lin
    2. {
    3. // 类体:由成员函数和成员变量组成
    4. };

    三.类的作用域

    1.类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作 符指明成员属于哪个类域。

    1. class lin
    2. {
    3. public:
    4. void lin_printf();
    5. private:
    6. char _name[20];
    7. char _sex[3];
    8. int _age;
    9. };
    10. // 需要指定lin_printf是属于lin这个类域
    11. void lin::lin_printf()
    12. {
    13. cout << _name << " "<< _sex << " " << _age << endl;
    14. }

    四.类/对象的大小计算

    1.类的大小与普通数据成员有关,与成员函数,静态成员无关,在空类的情况下,空类的大小为1,

    其后的计算需遵循内存对齐规则。

    结论:在遵循内存对齐规则的情况下,一个类的大小,实际就是该类中”成员变量”之和

    1. #include
    2. using namespace std;
    3. // 类中既有成员变量,又有成员函数
    4. class A1 {
    5. public:
    6. void lin1()
    7. {
    8. ;
    9. }
    10. private:
    11. int a;
    12. };
    13. // 类中仅有成员函数
    14. class A2 {
    15. public:
    16. void lin2()
    17. {
    18. ;
    19. }
    20. };
    21. // 空类
    22. class A3
    23. {
    24. ;
    25. };
    26. int main()
    27. {
    28. cout << sizeof(A1) << endl;
    29. cout << sizeof(A2) << endl;
    30. cout << sizeof(A3) << endl;
    31. return 0;
    32. }

     五.this指针

    1.C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参 数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该 指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

    2. this指针的特性

    (1). this指针的类型:类 类型* const,即成员函数中,不能给this指针赋值。

    (2). 只能在“成员函数”的内部使用

    (3). this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。

    (4). this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用 户传递

    1. void lin()
    2. {
    3. cout<<_lin<
    4. }
    5. //编译器处理成员函数隐含的this指针
    6. void lin(Date* this)
    7. {
    8. coot<<this->_lin<
    9. }

    3.判断下面代码运行的结果

    (1)正常运行

    1. // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
    2. #include
    3. using namespace std;
    4. class A
    5. {
    6. public:
    7. void Print()
    8. {
    9. cout << "Print()" << endl;
    10. }
    11. private:
    12. int _a;
    13. };
    14. int main()
    15. {
    16. A* p = nullptr;
    17. p->Print();
    18. return 0;
    19. }

    2.程序崩溃

    1. // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
    2. #include
    3. using namespace std;
    4. class A
    5. {
    6. public:
    7. void PrintA()
    8. {
    9. cout<<_a<
    10. }
    11. private:
    12. int _a;
    13. };
    14. int main()
    15. {
    16. A* p = nullptr;
    17. p->PrintA();
    18. return 0;
    19. }

     

     因为编译器需要处理成员函数隐含的this指针,this指针对0进行了解引用操作,导致程序崩溃。

     

  • 相关阅读:
    [黑马程序员Pandas教程]——分组与分箱
    bug05:腾讯短信SDK 引用报错 java.lang.NoSuchMethodError: org.json
    2022.5.28-YMO青少年奥林匹克数学竞赛复赛(一等奖)
    全网最详细SpringBoot、SpringCloud整合阿里云短信服务
    Flink学习19:算子介绍keyBy
    【Linux】线程
    ReLU激活函数
    100.一个linux内核选项对ssh的影响
    MySQL存储过程和函数知识点
    CSP-J 2023 第二轮认证入门级(含答案)
  • 原文地址:https://blog.csdn.net/qq_64425854/article/details/126018194