小工具知识网

当前位置: 首页 > 行业知识 > 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

行业知识

【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

2026-11-08 05:19:52 来源:互联网转载

=========================================================================

���关代码gitee自取:

C语言学习日记: 加油努力 (gitee.com)

 =========================================================================

接上期:

【C++初阶】二、入门知识讲解

(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)-CSDN博客

 =========================================================================

                     

一 . 面向过程和面向对象初步认识

C语言 -- 面向过程

                    

  • C语言是面向过程的,关注的是过程,分析出求解问题的步骤,
    通过函数调用来逐步解决问题

                       

  • 例子:

    假设要完成洗衣服这个目标,通过C语言完成就需要分出多个过程,如:
    拿盆子  =>  放水  =>  放衣服  =>  放洗衣粉  =>  手搓  =>  换水  =>  再放洗衣粉  =>  
    再手搓  =>  拧干衣服  =>  晾衣服

                         

                         


                        

    C++ -- 面向对象

                     

    • C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,
      依靠对象之间的交互解决问题

                         

    • 例子:

      同样是完成洗衣服这个目标,通过C++完成就需要找出需要的相应的对象,
      洗衣服需要的对象有:人、衣服、洗衣粉、洗衣机,

      然后就可以依靠对象的交互来完成整个洗衣服的过程:
      人将衣服放进洗衣机  =>  倒入洗衣粉  =>  启动洗衣机 ,清洗衣服并甩干

      可以看到整个过程是通过我们定义的四个对象之间的交互完成的,
      人不需要关心洗衣机具体是如何操作的

               

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                   

      二 . 类的引入 --  struct类

                         

      C语言struct结构体中只能定义变量,

      在C++中,strcut结构体内不仅可以定义变量,还可以定义函数。

      例如:

      之前在数据结构初阶中,用C语言方式实现的栈:

      【数据结构初阶】五、线性表中的栈

      (C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客

      这里实现的栈Stack结构体中只能定义变量;

      而如果以C++方式实现栈的话,会发现Stack结构体中还可以定义函数

      图示:

               

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                   

      三 . 类的定义 --  class类

      class类的介绍:

                        

      • C++中,虽然可以使用struct来定义类,但还是更喜欢通过class来定义类

                      

        图示:
                                    class className                            {                                //类体:由成员变量和成员函数组成                                    }; //和struct一样最后需要加上分号
        • class为定义类的关键字,className为类的名字,
          { } 中为类的主体,注:类定义结束时最后的分号不能省略

                        

        • 类体中的内容称为类的成员:
          类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数

                       

        • 定义类的成员变量时一般会在成员变量名前加上 “_” ,表示该变量为类内部的成员变量
          图示:

                               

                               


                              

          class类的两种定义方式:

                     

          第一种:成员函数的声明和定义都在类体中

          注:成员函数如果在类中定义,编译器可能会将其当成内联函数处理

          图示:

                                    

                                    

          ---------------------------------------------------------------------------------------------

                              

          第二种:类声明放在头文件中,成员函数实现放在 .cpp文件 中

          • 注:

            在 .cpp文件 中,需要通过类名和作用域限定符(::)指定实现类中的某个函数

                             

          • 类的作用域:
            类定义了一个新的作用域,类的所有成员都在类的作用域中。

            在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域

            图示:

                     

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                         

            四 . 类的访问限定符和封装

            访问限定符:

                                      

            • C++实现封装的方式:
              用类将对象的属性与方法结合在一块,让对象更加完善,

              通过访问权限(通过访问限定符管理权限)选择性的将其接口提供给外部的用户使用

                                  

              访问限定符有三个:

              • public(公有)、protected(保护)、private(私有)

                                

              • public(公有):被public修饰的成员在类外和类内都可以直接被访问
                               
              • protected(保护)和  private(私有):
                被修饰的成员在类外不能直接被访问,只能在类内被访问

                注:

                在类内外访问这方面,这两个访问限定符是类似的,

                在当前阶段,可以认为protected和private是没有区别的,

                之后了解了继承才能够知道两者的区别

                                          

                                          

                ---------------------------------------------------------------------------------------------

                                    

                访问权限作用域范围:

                • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止,
                  如果后面没有再出现过访问限定符,则作用域就到 “}” 为止,即类结束

                                       

                • class的默认访问权限为private,struct的为public(因为struct要兼容C语言)
                  注:

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

                                    

                  图示:

                                            

                                            

                  ---------------------------------------------------------------------------------------------

                                      

                  C++中struct和class的区别:

                  C++需要兼容C语言,所以C++中struct除了可以当成类使用,还可以当成结构体使用。
                  struct定义的类和class定义的类的区别:

                  struct定义的类默认的访问权限是public,class定义的类默认的访问权限是private

                  注:

                  在继承和模板参数列表位置,struct和class也有区别,后面再进行了解

                                       

                                       


                                      

                  封装:

                                    

                  • 面向对象有三大特性:封装、继承、多态。

                    在类和对象阶段,主要研究的是类的封装特性

                                     

                  • 封装:

                    将数据和操作数据的函数(方法)进行有机结合,隐藏对象的属性和实现细节,
                    仅对外公开接口来和对象进行交互

                                  

                  • 封装本质是一种管理,让用户能够更方便使用类,例如:

                    对于电脑这样一个复杂的设备,提供给用户的就只有一个开关机键,

                    通过键盘输入、显示器、USB插孔等,让用户和计算机进行交互,完成日常事务。

                    但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件

                                           

                  • 对于计算机使用者而言,不用关心内部核心部件,

                    比如主板上线路是如何布局的、CPU内部是如何设计的等等。
                    用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。

                    因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,

                    仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可

                                      

                  • 要在C++语言中实现封装,

                    可以通过类将数据以及操作数据的函数(方法)进行有机结合,
                    通过访问权限来隐藏对象内部实现的细节,控制哪些函数可以在类外部直接被调用

                             

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                 

                    五 . 类的实例化

                    • 用类类型创建对象的过程,称为类的实例化

                                    

                    • 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,
                      仅定义出一个类时并没有分配实际的内存空间来存储它。
                      例如:
                      建造房子时需要的设计图,设计图就可以看成是一个类,
                      通过设计图可以设计建造出多个类似的房子,

                      这里多个类似的房子就可以看成是设计图类的多个对象,
                      设计图只设计出需要什么东西,但是并没有实体的建筑存在,

                      同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

                                       

                    • 一个类可以示例化出多个对象,实例化出的对象,占用实际的物理空间,
                      存储类成员变量,但没有存储类成员函数,

                      因为同一个类的多个对象调用的是相同的成员函数,所以成员函数会存放在公共代码区

                      图示:

                               

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                   

                      六 . 类对象模型

                      计算类对象的大小:

                                     

                      类中既可以有成员变量,又可以有成员函数,

                      那么一个类的对象中包含了什么?又要如何计算一个类的大小呢?

                                  

                      类对象的存储方式:

                      • 一个类中可能有成员变量,或者成员函数,

                        但实际上类对象中只有类的成员变量,而没有成员函数,

                        因为成员函数可以被多个类对象共用,所以成员函数是存放在公共代码区中的,

                        而每个类对象的成员变量则是独立的

                                         
                      • 所以一个类对象的大小,实际就是该类中“成员变量”之和,
                        计算其大小时,需要用到和计算结构体大小同样的方法:内存对齐

                                    

                      • 一个类中如果没有成员变量,则称该类为空类,计算空类大小会比较特殊,
                        编译器给了空类对象一个字节来唯一标识这个空类的对象
                        图示:

                                             

                                             


                                            

                        结构体内存对齐规则:

                                    

                        计算类(对象)大小需要了解关于内存对齐的知识,
                        关于内存对齐之前有博客详细介绍过:

                        学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客

                                          

                        内存对齐简单回顾:

                        • 第一个成员在与结构体偏移量为0的地址处

                                          

                        • 其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处,
                          对齐数 = 编译器默认的一个对齐数 与 该成员类型大小 两者中的较小值

                          (VS中默认的对齐数为8)

                                            

                        • 结构体总大小为:最大对齐数的整数倍
                          最大对齐数 = 所有变量类型中最大者 与 默认对齐参数 两者中的较小值

                                         

                        • 如果是嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,
                          结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

                                   

                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                       

                          七 . this指针

                          this指针的引入:

                                        

                          先定义一个日期类Date:
                          //日期类Date:class Date{public:        void Init(int year, int month, int day)    {        _year = year;        _month = month;        _day = day;    }    void Print()    {        cout 

上一篇:揭秘源码视频下载秘籍,高清资源轻松获取!

下一篇:ISCC2023 web复现——老狼老狼几点了&where