C++干货 --类和对象(一)

前言:

       在C++中,类和对象是面向对象编程(OOP)的两个核心概念。类(Class)是一种用户定义的数据类型,它包含数据成员(变量)和成员函数(方法),用于描述具有共同属性和行为的对象的集合。对象(Object)则是根据类创建的实例。

        在之前学习C语言的过程中,我们知道,C语言是面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 而C++则是面向对象的语言,关注的是对象,将某一事拆分成不同的对象,通过不同对象之间的相互交互完成任务。

        例如,我们说洗衣服,C语言是怎样的呢?找出脏衣服->放到衣娄里->倒水->加洗衣粉..........

是按照过程一步一步实现。而C++是:洗衣服这件事拆出几个不同的对象:人、脏衣服、洗衣粉、洗衣机。洗衣服这件事是人、脏衣服、洗衣粉、洗衣机几个对象之间交互完成的。我们不必关注洗衣机洗衣服的具体过程。


类的引入:

        C语言中,我们经常使用的结构体,只能定义变量,而C++中,结构体不仅能定义变量,而且能狗定义函数。

结构体中的变量称为成员变量

 结构体中的函数则称为成员函数

 因为C++ 兼容C语言,为了加以区分,C++中以class来替代struct,升级成了类。

类的定义:

  1、类的结构

类的结构是这样的:

   class className

   {

        // 类体:由成员函数和成员变量组成

   };  

    C++将class定为类的关键字,className是类的名字,{ }为类的主体,同C语言一样,{ }的末尾依旧要加  

    { },即类体中的内容称为成员变量类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者 成员函数

    2、类的定义方法:

       类的定义方法有两种:1. 声明和定义全部放在类体中

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

        2、类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加 类名 ::

 

  代码的规范性: 

 

this指针也是C++类和对象中的一个重要知识点,实际上,目前我们只需要取不同名字加以区分即可。

类的访问限定符与封装:

   1、访问限定符:

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

     

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

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

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

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

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

小问题:就本篇介绍的C++中class和struct的区别是什么? 

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

  2、封装:

       封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。 封装本质上是一种管理,让用户更方便使用类。

     就像台式机一样,相较于其内部复杂的结构,对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计 算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以 及键盘插孔等,让用户可以与计算机进行交互即可。

       在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

      这样方便了对代码的维护,让代码更加工整。

类的作用域:

  我们先看这样一个问题,我们将类的声明与定义分开了,但是却发现报错了,问题是没有找到我们定义的变量的出处。

   问题出在哪?

   问题出在计算机将该函数认定为一个普通的函数,而非类中的成员函数。

   因此我们引出了这样的概念:类的作用域。类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

     

   这样还有一个好处是刚好区分了命名冲突的问题。

类的实例化

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

1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没 有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个 类,来描述具体学生信息。 类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。 谜语:"年纪不大,胡子一把,主人来了,就喊妈妈" 谜底:山羊

2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

3、类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象 才能实际存储数据,占用物理空间

stack s;是类实例化出的对象,到这时候才真正的开出了空间。

 

 类对象模型:

    如何计算类的对象的大小?

          

      问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?成员函数是不是包括在类的大小中?

    对类的对象的猜测:

   1、对象中包含类的各个成员

             

缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

  2、代码只保存一份,在对象中保存存放代码的地址 

  

3、只保存成员变量,成员函数存放在公共的代码段

     

 根据上图的结果来看,类的大小是12个字节,并未包括两个函数的大小(下面三个变量刚好12个字节)。所以推测应该使用的是第3种方法

    结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

3、结构体的内存对齐规则:

关于结构体的内存对齐,我专门写过一篇博客,这里就不多赘述,想了解的欢迎看我的相关博客

 结构体的内存对齐-CSDN博客


ps:限于我个人的水平,对文章中的某些知识写的较为笼统,望读者包含。后面对文章相关的知识有更深刻的理解后我会对文章进行相关的补充修改。 

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值