您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页类和对象(上)—— 终于要面对对象啦!

类和对象(上)—— 终于要面对对象啦!

来源:叨叨游戏网

前言

前面简单认识完C++,现在就开始学习C++的主要特点了——类和对象。

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

  • 我们之前学习的C语言是一个面向过程的语言,比较在意的是处理这个事情的过程,而C++关注的并不是过程,而是对象。

举例来说:总共有四个对象:人、衣服、洗衣粉、洗衣机;
整个洗衣服的过程:人将衣服放进洗衣机、倒入洗衣粉,启动洗衣机,洗衣机就会完成洗衣过程并且甩干;
整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关新洗衣机具体是如何洗衣服的,是如何甩干的。

二、类的引入

  • C语言结构体中只能定义变量,再C++中,结构体不仅可以定义变量,也可以定义函数。
  • 在C++中,更喜欢用class来代替struct。
  • 类域是一个整体,成员变量可前可后,都是能被编译器找到的。
  • C++中可以直接用类的名字,所以可以省略struct。
  • class是C++中表示类的关键字,一般定义类就用class。

三、类的定义

  • 记得最后有个分号(想结构体)。
  • 类体中的内容称为类的成员;类中的变量称为类的属性成员变量,类中的函数称为类的方法或者成员函数

类的定义方式有两种,如下:类是一个整体,成员变量可前可后

成员变量命名规则的建议:

  • 一般我们会让成员变量前面或者后面加上_来与局部变量中的同名变量区分。需要注意的是类域中的访问顺序(编译器的查找顺序):局部变量、成员变量、全局变量。

根据访问顺序,其实是局部的year赋给成员变量year。

四、类的访问限定符及封装

访问限定符

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

访问限定符有三个:public(公有),protected(保护),private(私有)。
public修饰的成员在类外可以直接被访问。
protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)。
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
如果后面没有访问限定符,作用域就到 } 即类结束。
class的默认访问权限为private,struct为public(因为struct要兼容C)。

封装

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

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

封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

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

反正就是过程的数据访问不到,只能用封装好后那些结果。

五、类的作用域

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

六、类的实例化

  • 用类类型创建对象的过程,称为类的实例化。
  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。

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

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

七、类对象模型

如何计算类对象的大小

首先和结构体一样,存在内存对齐。

  • 类的成员存储方式:类的属性(成员变量)存储在对象中但是类的方法(成员函数)并没有存储在对象中,而是存储在一个公共代码段,里面有各个成员函数的定义。当调用时,直接跳转到该位置进行调用。这样当一个类创建多个对象但是调用同一个函数时,避免了每个对象里都要保存一份代码,浪费空间。

类内存对齐规则

内存对齐规则:

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(也叫做结构体的对齐数)(所有成员变量中最大对齐数,这时候就不用管默认对齐数了,因为默认对齐数了在计算成员变量对齐数时就已经考虑过了)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己对齐数(也可能是默认对齐数了,因为嵌套结构体的对齐数为自己原本的对齐数(自己原本的对齐数是自己成员中的最大对齐数)与目前在的这个结构体的默认对齐数了的较小者)的整数倍处(因为嵌套的这个结构体的对齐数是它原本的对齐数),结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

八、this指针

引入this指针

这个this指针的类型与对象的类型匹配,是对象类型的一级指针。

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

this指针的特性

  • this不能在形参和实参显示传递,但是可以在函数内显示使用(意思在形参和实参中不能出现this,但是在函数体内部访问成员变量时,可以自己在前面加个this->,加不加都行,编译器会自动加)。
  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用。
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针,它是在栈区,函数调用结束后就销毁了
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
    不需要用户传递
  • this可以为空,只要没有对空指针解引用就行,在访问成员变量时会对this指针解引用。只是调用该对象的成员函数并不会对this解引用,虽然是->,但是也没解引用,因为底层是在这一步call跳转到公共代码段去了,这一步根this指针没有关系。

这个就可以运行,并没有出错(因为没有访问成员变量)。

这个就会运行时报错(因为访问成员变量了,对空指针解引用,所以报错)。

总结

  • C++中通过类可以将数据以及操作数据的方法进行完美结合,通过访问权限可以控制那些类的方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。而且每个方法(函数)不需要传递对象指针的参数了,编译器编译之后该参数会自动还原即C++中对象指针的参数是编译器维护的,C语言中需用用户自己维护。


  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐




更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务