C++入门,详解类和对象(1)

类和对象

  • 一,前言
  • 二,类的介绍
    • 2.1类的引入
    • 2.2类的定义
  • 三,类访问限定符及其分装
    • 3.1访问限定符说明
  • 四,类的作用域
  • 五,类的实例化
  • 六,类对象模型
    • 6.1类的存储方式
    • 6.2类的大小计算
  • 七,this指针
    • 7.1this引入
    • 7.2this指针的特性
  • 八,总结

一,前言

类和对象学习是算我们正式进入C++的学习,这一章内容还是很多的,我们需要打好这一节的基础。

二,类的介绍

2.1类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数
在我们之前的C语言中,结构体内只能写成员变量,函数则是写在了外面,C++则对其作了优化,新引入了成员函数的概念,就是函数可以写在结构体中。

2.2类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类成员函数的两种定义方式
1.声明和定义都放在类中。**成员函数如果在类中定义,编译器可能会将其当成内
联函数处理。**这里还需要注意的是虽然编译器会把它当成内联函数,但是如果函数过长,编译器就会自动取消内联函数。
在这里插入图片描述
2.声明和定义分离
类声明放在.h文件中,成员函数定义放在.cpp文件中,成员函数名前需要加类名::在这里插入图片描述
一般我们写类更倾向于第二种写法,代码的可读性更高。

三,类访问限定符及其分装

前面的类中出现了pubic和private这样新的关键词这就是我们要说的类访问限定符
在这里插入图片描述

3.1访问限定符说明

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

四,类的作用域

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

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

五,类的实例化

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

六,类对象模型

我们在c语言学习结构体类型的时候去计算他的大小,那类应该怎么算呢?
我们中岛在类中不仅仅有成员变量,还有成员函数,那类的大小里有包括成员函数吗?

6.1类的存储方式

我们一共有两种存储的猜想

  • 对象中包含类的各个成员
    在这里插入图片描述
    缺陷:每个对象的成员函数都是不同的,但是调用一份函数,按照这样去存储的话,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。
    所以计算机真正采用的存储方式是:
    只保存成员变量,成员函数存放在公共的代码段。
    在这里插入图片描述

6.2类的大小计算

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

七,this指针

7.1this引入

我们用一个Date类来解释this。

class Date
{ 
public:
 void Init(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
 private:
 int _year;     // 年
 int _month;    // 月
 int _day;      // 日
};
int main()
{
 Date d1, d2;
 d1.Init(2022,1,11);
 d2.Init(2022, 1, 12);
 d1.Print();
 d2.Print();
 return 0;
}

在这里插入图片描述

对于上述类,有这样的一个问题:
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

这里起到作用的就是this指针了。C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。上面的话用上面代码解释就是:
在这里插入图片描述
这个工作是编译器自动给我们完成的所以我们不可以自己去写。

7.2this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
    在这里插入图片描述

八,总结

这一篇我们先介绍了类的基本概念,让我们有了最基础的框架,下一篇我们就要开始去具体的介绍类的函数,和代码了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​Unity Vuforia 新手(图片识别)教程,后续整理 实体识别 详细流程

文章目录 前言一、Vuforia是什么&#xff1f;二、Unity导入Vuforia1.去Unity - Windows – Asset Store&#xff0c;搜vuforia engine&#xff0c;添加到我的资源2.打开package Manager&#xff0c;导入到工程中即可3.或者在vuforia engine官网下载的Unity包导入4.检查是否导入…

选择最适合你的接口测试工具:SoapUI、JMeter、Postman!

在软件开发的过程中&#xff0c;接口测试是确保系统正常运行的关键环节。为了有效地执行接口测试&#xff0c;选择适当的工具至关重要。在这篇文章中&#xff0c;我们将比较分析三种常见的接口测试工具&#xff1a;SoapUI、JMeter和Postman&#xff0c;以帮助你了解它们的优势和…

TSINGSEE青犀视频平台EasyCVR修改设备通道不生效是什么原因?该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

黑马程序员微服务 第五天课程 分布式搜索引擎2

分布式搜索引擎02 在昨天的学习中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天&#xff0c;我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

智能导诊的开发技术有哪些?

智能导诊源码 智能导诊是医疗领域中一项重要的应用&#xff0c;它可以帮助医生和患者更快速、更准确地诊断疾病&#xff0c;提高医疗效率和精度。以下是智能导诊开发技术的几个方面: 1.数据收集整合 智能导诊系统需要收集大量的医疗数据&#xff0c;包括患者症状、病史、检查结…

Cesium 展示——绘制圆的几种方式(全面)

文章目录 需求分析1. 使用圆形几何体 椭圆(CircleGeometry):2. 使用多边形几何体 Polygon(PolygonGeometry):3. 使用自定义几何体(CustomGeometry):4. 使用线实体(polyline):其他需求 总结绘制圆的几种方式 分析 1. 使用圆形几何体 椭圆(CircleGeometry): …

OSS大文件分片上传

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、原理二、工具类二、注意事项总结 前言 最近做到项目中一个上传视频的功能&#xff0c;需要使用大文件分片上传&#xff0c;在网上找了一些资源借鉴&#xf…

PyCharm 【unsupported Python 3.1】

PyCharm2020.1版本&#xff0c;当添加虚拟环境发生异常&#xff1a; 原因&#xff1a;Pycharm版本低了&#xff01;不支持配置的虚拟环境版本 解决&#xff1a;下载PyCharm2021.1版本&#xff0c;进行配置成功&#xff01;

【大数据基础平台】星环TDH社区开发版单机部署

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#…

创米云无代码开发:连接CRM、用户运营、广告推广,实现电商平台的高效集成

创米云无代码开发简介 作为一家专注于小程序开发的优质IT技术服务商&#xff0c;创米云提供了国内领先的自主研发的小程序开发工具。这款工具的制作过程无需任何代码&#xff0c;用户只需利用拖拽可视化组件即可完成小程序的开发。创米云的小程序开发工具拥有海量的小程序行业…

错误:ERROR:torch.distributed.elastic.multiprocessing.api:failed

在多卡运行时&#xff0c;会出现错误&#xff08;ERROR:torch.distributed.elastic.multiprocessing.api:failed&#xff09;&#xff0c;但是单卡运行并不会报错&#xff0c;通常在反向梯度传播时多卡梯度不同步。但我是在多卡处理数据进行tokenizer阶段报错&#xff0c;这竟然…

ZYNQ实验--Petalinux 安装

一、Petalinux 简介 PetaLinux是一个由Xilinx公司提供的嵌入式Linux开发工具套件&#xff0c;专门用于在Xilinx器件上构建、定制和部署嵌入式Linux系统。这个工具套件旨在简化嵌入式系统的开发过程&#xff0c;特别是针对使用Xilinx的可编程逻辑器件的系统。PetaLinux是Xilinx …

《信息安全原理与实践》(第3版):全面引领信息安全领域新潮流

在当今信息化社会的快速发展中&#xff0c;信息安全问题无疑是最为人们所关注的焦点之一。而《信息安全原理与实践》(第3版)的出版&#xff0c;无疑为解决这一问题提供了强大的理论和实践支持。 首先&#xff0c;这本书经过全面修订和更新&#xff0c;以适应信息安全领域日新月…

资产跟踪影响利润的 7 种方式

几乎每个工人都被托付某种有形资产来完成他们的工作。根据您的工作领域&#xff0c;这可能是一套制服、徽章、一台电脑、一部工作电话、一套建筑钥匙、一个工具包&#xff0c;甚至是一台价值超过您年薪的机器。 无论如何&#xff0c;我们都熟悉丢失您所保管的物品所带来的压力…

vite => .env 文件配置和使用

.env.development .env.production VITE_API_BASE_URL /api # 开发环境代理地址 .env.development 是在开发环境中的代理地址 .env.production 是在线上的代理地址 &#xff08; 两个 .env 内部的变量都是一样的 vite 会在你开发环境和线上环境自动做切换 &#xff09; …

flutter开发web应用支持浏览器跨域设置

开发web应用难免会遇到跨域问题&#xff0c;所以flutter设置允许web跨域的设置是要在你的flutter安装路径下面 flutter\bin\cache 找到flutter_tools.stamp文件&#xff0c;然后删除掉&#xff1a;这个文件是临时缓存文件 然后找到 flutter\packages\flutter_tools\lib\src\web…

树和森林 查找

讨论3.1 黄金分割查找&#xff1f; 在二分查找中&#xff0c;我们是取mid等于left和right的中间值&#xff0c;即用等分的方法进行查找. 那为什么一定要等分呐&#xff1f;能不能进行“黄金分割”&#xff1f;也就是midleft0.618(right-left),当然mid要取整数。如果这样查找&…

【腾讯云 HAI域探秘】浅尝一番AI绘画

前言 腾讯云高性能应用服务 HAI 是为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。 我之前也参与锅一个AI绘画的活动&#xff0c;是基于InsCode的&#xff0c;都可以在线训练大模型&#xff0c;开发自己的AI应用程序。 这次腾讯…

Supervisor管理器

如果宝塔版本是低于 7.9 可以选用supervisor 管理器&#xff0c;宝塔7.9及以上版本此工具可能出BUG&#xff0c;请选择 堡塔应用管理器跳过本页&#xff0c;看堡塔应用管理器 Supervisor 管理器 和 堡塔应用管理器 二选一使用 步骤总结&#xff1a; 一、切换PHP命令行版本和站…

天机学堂-1、项目搭建,微服务架构设计

1.学习背景 各位同学大家好&#xff0c;经过前面的学习我们已经掌握了《微服务架构》的核心技术栈。相信大家也体会到了微服务架构相对于项目一的单体架构要复杂很多&#xff0c;你的脑袋里也会有很多的问号&#xff1a; 微服务架构该如何拆分&#xff1f; 到了公司中我需要自…