当前位置: 首页 > news >正文

【C++语法】类和对象(1)

3.类和对象(1)

对象的概念

C语言是面向过程的,注重解决问题的过程,而C++是面向对象的,注重解决问题时有几个对象参与

类的定义

  • 在C语言中struct往往用于定义结构体,而在C++中不仅可以兼容C语言的用法,还可以定义类。区别在于结构体中只能定义变量,而在类中既可以定义变量,也可以定义函数。

    typedef int SLTDataType;
    typedef struct SList_C
    {//每一个节点存放的数据SLTDataType data;//指向下一个节点的地址struct SList_C* next;
    }
    

    这是用C语言定义的结构体

  • 但是通常在C++中我们通常不会用struct来定义类,而是用另一个关键字calss,用struct和class来定义类会有一点不同,这里我们就要引入另一个概念叫做类的访问限定

类的访问限定

我们在定义好类之后需要合理使用类中的成员变量和成员函数,为了防止其他人不小心修改成员变量的值,我们通常会指定访问成员变量的途径,比如使用规定的成员函数进行访问,为了防止非法访问成员变量,我们会给成员加上访问限定。

要点:

  1. 访问限定需要访问限定符,如图所示,public表示可以在类之外的作用域使用,protect和private都表示只能在类之内使用;

  2. 在类中使用访问限定符,从该访问限定符到下一访问限定符之间的成员变量,都满足该限定条件,如果没有下一访问限定符,则范围持续到类结尾

  3. 如果类中没有访问限定符class定义的类默认访问权限为privatestruct定义的类默认访问权限为public(因为要兼容C)

在这里插入图片描述

问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。

示例代码:

在这里插入图片描述

上面代码为用C++定义的类来实现栈的一部分,相较于C语言实现栈,用类实现栈的区别:

  1. 在类中可以定义函数而且这个函数可以直接使用类中定义在函数之外的成员变量,不需要再进行传参,对此最好用之前C语言实现的栈进行区分

  2. 定义类时需要注意:
    class为定义类的关键字,ClassName为类的名字,0中为类的主体,注意类定义结束时后面分
    号不能省略。

  3. 除了类的定义有两种方式:
    1>就像上面的代码一样,定义和声明全部放在类体中,需要注意是:成员函数如
    果在类中定义,编译器可能会将其当成内联函数处理
    2>定义和声明分开,成员函数声明在类中,定义在类外,此时在类之外定义成员
    函数需要像命名空间一样指定作用域

在这里插入图片描述

  1. C++中,类这一种数据结构体现了C++面向对象的三大特性的其中一种:封装

  2. 封装是将对象和对象的使用方法进行有机结合,并且隐藏对象的基本属性,只公开使用对象的接口实现与对象的交互。封装实际上是一种数据管理,让用户更方便的使用类。

  3. 面向对象的三大特性:多态、继承、封装;不只是C++只要是面向对象的语言都会有这三大特性

类的作用域

**之前我们学了命名空间,命名空间有自己的作用域,在作用域之外使用命名空间中定义的变量,函数,需要指定命名空间。类也是一样,创建一个类,每个类也有自己的作用域,在作用域之外使用类中定义的函数,需要指定作用域。**比如之前用声明和定义分离的方法定义类,在类之外定义类中的成员函数时要指定作用域。

类的实例化:

类的实例化就是用已经定义的类创建变量(对象)的过程,一种类可以创建多个对象,就像结构体一样,定义结构体只是定义了一个模板,编译器不会给这个模板开辟内存空间,而用结构体创建对象时,才会向内存中申请空间

在这里插入图片描述

类的储存空间大小

  • 类的实例化后,编译器会为创建的对象申请内存空间,同一类创建的不同对象的成员变量会单独有自己的内存空间但同一类创建的不同对象的成员函数会放在公共代码段,并不像成员变量一样申请单独的空间。防止空间浪费
  • 类的储存也存在内存对齐,内存对齐的规则与结构体的对齐规则一致

结构如图所示:

在这里插入图片描述

验证:

在这里插入图片描述

函数调用时,函数调用的地址一致他们调用的是一个函数

特例:

在这里插入图片描述

即便没有成员变量,类的大小也有1字节,这一个字节不用来存放数据,仅用来标识对象被定义出来

this指针

  • 从前面的内容可知同一个类实例化的对象他们调用的都是同一个函数,但在通过不同的对象(被同一个类定义)使用类中声明的函数时,结果往往不会相同,存在这样的结果是因为C++编译器给每一个“非静态的成员函数”的参数都增加了一个指针变量—this指针
  • C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

如下图所示:被注释掉的代码就是编译器自动完成的关于this指针的传递过程

在这里插入图片描述

this指针的特性
  1. this指针的类型为[类名]*const,this指向谁不可以修改,但可以修改指向对象的内容

  2. 使用者不可以自己定义this指针但可以在成员函数中使用this指针

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

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

在这里插入图片描述

补充

存this指针

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

[外链图片转存中…(img-HCyhq8M7-1745672165900)]

补充

在这里插入图片描述

相关文章:

  • 什么时候使用Python 虚拟环境(venv)而不用conda
  • 软件设计案例分析学习笔记
  • 单片机-89C51部分:3、创建工程
  • Jmeter数据库url开关设置+常用Beanshell
  • 关于Code_流苏:商务合作、产品开发、计算机科普、自媒体运营,一起见证科技与艺术的交融!
  • FPGA 100G UDP纯逻辑协议栈
  • nuxt3项目搭建:一、初始化项目流程指南
  • 如何在 Windows 10 中使用 WSL 和 Debian 安装 Postgresql 和 Postgis
  • Ext JS模拟后端数据之SimManager
  • 提取PPT图片
  • 关于Android Studio的Gradle各项配置
  • 泰迪杯实战案例学习资料:生产线的故障自动识别和人员配置优化
  • 26 Arcgis软件常用工具有哪些
  • 使用MobaXterm远程登录Ubuntu系统:SSH服务配置教程
  • 微信小程序 - 根据经纬度打开导航
  • 字节 AI 原生 IDE Trae 发布 v1.3.0,新增 MCP 支持
  • AI图像编辑器 Luminar Neo 便携版 Win1.24.0.14794
  • C++:类和对象(上)---镜中万象:C++类的抽象之境与对象的具体之象
  • 【运维】云端掌控:用Python和Boto3实现AWS资源自动化管理
  • 通过门店销售明细表用PySpark得到每月每个门店的销冠和按月的同比环比数据
  • 上海灵活就业人员公积金新政有哪些“创新点”?
  • 第二艘国产大型邮轮实现坞内起浮,重点强化邮轮供应链本土化建设
  • 为何未来的福利国家必须绿色且公平
  • 恒瑞医药赴港上市获证监会备案,拟发行不超8.15亿股
  • 牛市早报|今年国内核电项目审批首次开闸,离境退税起退点下调
  • 从“网点适老化”到“社区嵌入式”,“金融为老上海模式”如何探索?