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

news2024/10/5 18:32:23

文章目录

  • 前言
  • 浅浅了解
    • 一、面向过程和面向对象
    • 二、 类和对象的关系
    • 三、创建类和对象
  • 逐步深入
    • 一、类的访问限定符
    • 二、 封装
    • 三、类的作用域
    • 四、类对象模型
    • 五、this指针


前言


浅浅了解

一、面向过程和面向对象

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.
比如洗衣服这件事:
在这里插入图片描述

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
在这里插入图片描述


二、 类和对象的关系

上面洗衣服的模型,有4个对象:人、衣服、洗衣粉、洗衣机。
我们对于这些对象是如何定义的呢?是通过类来定义的。

类是对象的模板或蓝图,对象则是类的实例化,即根据类创建出来的具体实体。
简单说:类是房子设计图,对象是房子

三、创建类和对象

那我们如何定义一个类呢?如下
在这里插入图片描述
具体如下:
在这里插入图片描述
在类中,我们不但可以定义成员变量即上面的a,top,capacity,可以定义成员函数即上面的Init(),push()。
其中成员函数可以定义在类的外面,声明在类的里面。
在这里插入图片描述


创建一个对象并使用成员函数
在这里插入图片描述


其中stack是一个类,st是stack的一个实例对象。


逐步深入

看完上面如何创建一个类、对象,你肯定有很多疑惑。为什么类会有成员函数?类为什么会有public,private? 类外定义成员函数为什么要使用作用域解析运算符::?下面我们开始渐渐深入了解。

一、类的访问限定符

以前在C语言中,我们使用结构体来自定义类型,但使用结构体有一些弊端。假如我们现在定义一个数据结构 - 栈。
在这里插入图片描述
同理,StackPush(),StackPop()……都可以不用写函数,直接访问结构体成员就可以了。即使数据结构要求使用函数,但你并没有禁止直接访问结构体成员。于是c++之父对结构体的访问做出一些规定,即添加了访问限定符

在c++中,结构体被升级为了,不过我们一般不用结构体来定义类,而是用一个新的关键字class来替代struct。

c++的访问限定符有以下三种:
在这里插入图片描述
public - 表示可以在外界访问。
private - 表示只能在类里访问。
protected, - 表示只能在类和该类的派生类里访问。

在两个访问限定符之间的内容,它的访问权限为第一个访问限定符。
在这里插入图片描述
如下:
在这里插入图片描述
这时,你就只能通过类的成员函数来改变了。


二、 封装

面向对象的三大特性:封装、继承、多态。
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

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

类中添加成员函数,目的是为了将相关的数据和操作封装在一起,使得数据和操作成为一个整体,从而更好地组织代码和实现功能。成员函数可以访问和修改类的成员变量,也可以进行复杂的计算和逻辑操作,对外部提供更为友好的接口。
同时,使用成员函数还能够实现面向对象编程的一些基本特性,例如封装、继承、多态等,更好地体现了面向对象编程的思想。另外,成员函数也可以作为类之间进行交互和通信的接口,方便实现各个类之间的协同工作。


三、类的作用域

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

当你在外界定义成员函数时,需要使用::来指明函数属于哪一个类域。

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
 cout << _name << " "<< _gender << " " << _age << endl;
}

四、类对象模型

对于一个类的,我们该如何计算它的大小呢?
这和计算结构体的大小一致。

结构体对齐规则:
结构体(struct)的数据成员, 第一个数据成员存放的地址为结构体变量偏移量为0的地址处.
其他结构体成员自身对齐时, 存放的地址为min{ 有效对齐值为自身对齐值, 指定对齐值 } 的最小整数倍的地址处.
注 : 自身对齐值 : 结构体变量里每个成员的自身大小
注 : 指定对齐值:有宏 #pragma pack(N)指定的值, 这里面的 N一定是2的幂次方.如1, 2, 4, 8, 16等.
如果没有通过宏
在32位Linux主机上默认指定对齐值为4, 64位的默认对齐值为8,
AMR CPU默认指定对齐值为8;
vs-8
注:有效对齐值:结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中 较小的一个.
总体对齐时, 字节大小是min{ 所有成员中自身对齐值最大的, 指定对齐值 } 的整数倍.

在这里插入图片描述
类的大小的计算方式也是这样,但是类新增了成员函数,成员函数的大小难道不计算吗?这就要先了解一下类的存储方式了。

在这里插入图片描述
请问类采用哪种存储方式?
答案是第三种,成员函数不放在对象中,而是放在公共代码段。
我们只用测试一下类的大小就知道了。
在这里插入图片描述
可见,成员函数并没有计算在其中,至于为什么,其实想想也很知道,如果每个对象都自带函数,这就太浪费,不如每一个对象都共用同一个函数。

对于一个空类,它的大小规定为1字节
在C++中,空类的大小虽然没有定义成员变量,但是由于每一个实例都应该拥有一个唯一的地址,因此编译器为其分配了一个字节的空间以确保该类的每一个对象都具有唯一的地址。
空类继承其他类或者包含虚函数时,所占用的空间将取决于继承或虚函数表的大小,而不是定为1字节。在这里插入图片描述


五、this指针

对于成员函数,你是否有下面的疑惑?
在这里插入图片描述
答案:很显然不是,成员函数里的a是实例对象里的a,类里面的成员变量只是“图纸”。
那这里就有一个问题了,成员函数里的成员变量是实例对象里的成员变量,上面又说,成员函数是放在公共代码段,所有对象共用,那成员函数是怎么区分?
在这里插入图片描述

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

在这里插入图片描述
编译器进行了暗箱操作,也就是说,你设置的成员函数都自带一个隐形参数,只不过你看不到,而且不允许你手动加上。
this指针的特性

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

  2. 只能在“成员函数”的内部使用,不允许你添加在函数实参/形参里在这里插入图片描述

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

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


根据this指针的特性,回到以下两个问题:

  1. this指针存在哪里?
  2. this指针可以为空吗?

答案:this指针存储在栈上,因为它是形参。
this指针可以为空,但要满足一定条件
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能汽车开启中央计算革命,全场景智能“车芯”强势崛起

伴随着汽车跨域融合时代的到来&#xff0c;智能汽车芯片正处于快速迭代期&#xff0c;同时牌桌上的玩家也在加速挪换位置。 一方面&#xff0c;包括丰田、大众集团等在内的全球汽车制造商正在进入芯片平台的切换周期&#xff0c;加速推动汽车芯片市场格局的改变。 另一方面&a…

Ubuntu22.04部署eurekaserver集群

Ubuntu22.04部署eurekaserver集群 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 每次都启动eureka的项目&#xff0c;太繁琐了&#xff0c;我们把eureka部署到Ubuntu&#xff0c;就可以愉快的玩耍了。 1 配置文件设置 准备了…

设计模式 -- 观察者模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

淘宝天猫数据分析:2023年健康养生三大品类数据分析

随着人们健康意识的不断增强&#xff0c;越来越多的年轻人都开始加入养生大军的队伍中&#xff0c;我国的健康养生产业也迎来了发展机遇。 在天猫平台上&#xff0c;养生茶、养生壶和滋补养生原料是养生市场的几大重点类目&#xff0c;接下来&#xff0c;结合鲸参谋电商数据分析…

Docker 相关概念

1、Docker是什么&#xff1f; 如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案就是使用容器。Docker之所以发展如此迅速&#xff0c;也是因为它对…

电脑硬盘分区合并怎么操作?分享2个方法!

案例&#xff1a;电脑硬盘怎么分区&#xff1f; 【我把我的电脑硬盘分成了多个区域&#xff0c;这样可以方便存储和管理数据。现在我需要调整分区&#xff0c;对分区进行合并&#xff0c;但我不知道该如何操作&#xff0c;有没有小伙伴知道&#xff1f;】 在使用电脑的过程中…

4核8G云服务器4c8g或4h8g指的是什么?

4核8G云服务器什么意思&#xff1f;4c8g或4h8g代表CPU内存配置&#xff0c;4c8g是指4核CPU、8G内存&#xff0c;准确来讲由于是云服务器&#xff0c;4核指的是4核vCPU&#xff0c;4核8G就是指云服务器CPU内存配置。云服务器不只是CPU内存&#xff0c;还有公网带宽和系统盘&…

经典 Learned Index 结构设计及其应用

引言 学习索引是一种新型的索引结构&#xff0c;可以帮助数据库更快地查找数据。学习索引的诞生可以追溯到 2017 年&#xff0c;由 Google Brain 团队的 Kraska 等人在论文[1]中首次提出,探讨了使用神经网络替代传统数据结构&#xff08;如 B-Tree&#xff09;来构建索引的可行…

appuploader 常规使用登录方法

转载&#xff1a;登录appuploader 目录 登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录&#xff0c;弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号&#xff0c;只是普通的apple账号&#xff0c;请勾选上未…

题目 2056: 汉诺塔 ==理解递归

题目 2056: 汉诺塔 https://www.dotcpp.com/oj/problem2056.html 做题情况 参考代码&#xff1a; //package Dotcpp;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();// prin…

3.30 haas506 2.0开发教程-example - SD卡存储数据读写

SD卡存储数据读写 案例说明数据的写入与读取串口工具读取数据接收数据CSV格式 案例说明 部分设备使用过程中需要保存大量数据到TF卡中&#xff0c;大部分场景拔插TF卡有不太方便。 所以本案例介绍一种使用串口工具取出设备TF卡中的数据保存在电脑中的方法。 保存格式可以自己定…

详细安装使用教程】店侦探 - 跟踪店铺数据,学习运营技巧,引流关键词,电商人必备工具

简介 店侦探插件是一款电商网络浏览插件&#xff0c;能够帮助店主更好地运营自己的网店&#xff0c;这款插件功能十分全面强大&#xff0c;可以全面跟踪店铺的销量情况、引流关键词、直通车、营销活动、宝贝变更跟踪&#xff01;感兴趣的朋友快来体验吧&#xff0c;跟踪店铺数…

常见的用户密码加密及破解方法

用户密码安全是互联网行业需要保障的重要安全之一&#xff0c;由于黑客的入侵和内部的泄露&#xff0c;保证用户密码安全并不是件容易的事情&#xff0c;但如果采用合适的算法加密用户密码&#xff0c;即使信息泄露出去&#xff0c;黑客也无法还原出原始的密码(或者还原的代价非…

vue3 封装ECharts组件

一、前言 前端开发需要经常使用ECharts图表渲染数据信息&#xff0c;在一个项目中我们经常需要使用多个图表&#xff0c;选择封装ECharts组件复用的方式可以减少代码量&#xff0c;增加开发效率。 ECharts图表大家应该用的都比较多&#xff0c;基础的用法就不细说了&#xff…

如何成为企业急需的技术人才:掌握这些技能,提升你的实力和竞争力

在当前竞争激烈的互联网环境中&#xff0c;作为程序员等技术岗&#xff0c;必须不断的学习&#xff0c;才能不断提升自身实力&#xff0c;锻炼自身技能。想要成为一名企业急需的技术人才&#xff0c;需要学习哪些技能呢&#xff1f; 一、IT技术发展背景及历程 IT技术是当今社…

如何借助分布式存储 JuiceFS 加速 AI 模型训练

传统的机器学习模型&#xff0c;数据集比较小&#xff0c;模型的算法也比较简单&#xff0c;使用单机存储&#xff0c;或者本地硬盘就足够了&#xff0c;像 JuiceFS 这样的分布式存储并不是必需品。 随着近几年深度学习的蓬勃发展&#xff0c;越来越多的团队开始遇到了单机存储…

【22-23 春学期】人工智能基础--AI作业6-误差反向传播

老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 目录 老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 1.梯度下降 2.反向传播 3.计算图 4.使用Numpy…

ROS第四十四节——路径规划

1.新建launch文件 nav05_path.launch <launch><node pkg"move_base" type"move_base" respawn"false" name"move_base" output"screen" clear_params"true"><rosparam file"$(find nav_dem…

Mybatis 知识总结1(入门、JDBC、数据库连接池、lombok介绍)

Mybatis 知识总结&#xff08;一&#xff09; 3.1 Mybatis 介绍 什么是 Mybatis ? MyBatis 是一款优秀的持久层框架&#xff0c;用户简化 JDBC 的开发。MyBatis 是 Apache 的一个开源项目 iBaits&#xff0c;2010年这个项目由 apache 迁移到了 google code&#xff0c;并且改…

Chapter 6 :CDC Constraints(ug903)

6.1 About CDC Constraints 跨时钟域&#xff08;CDC&#xff09;约束适用于具有不同发射和捕获时钟的时序路径。根据发射和捕获时钟的关系以及在CDC路径上设置的时序异常&#xff0c;有同步CDC和异步CDC。例如&#xff0c;同步时钟之间但被错误路径约束覆盖的CDC路径…