C++类和对象上

3e78cdbc5474468196586ac4cad9c377.png

1. 类的定义

1.1 类定义格式

• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。

语法:class{//成员,行为...};

• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,这个只是⼀些惯例。

• C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,struct用法和class一样(区别在访问限定符中),但⼀般情况下我们还是推荐⽤class定义类。

• 定义在类⾯的成员函数默认为inline(内联)。所以在实现复杂的程序中我们对于一些简单且调用多的函数我们直接在类里面定义,而复杂一些的函数则,在类里面声明,在对应的源文件里面定义。

eg:简单定义一个日期类

#include <iostream>
using namespace std;
class Date
{//行为void Prin(){;}
void Inin(int x,int y,int z)
{_day=x;_year=y;_month=z;
}//成员int _day;int _year;int _month;//....
};

定义完了之后又如何调用呢?而调用之前我们需要了解访问限定符。

1.2 访问限定符

3983392072b541a88947d1eae876235c.png

注:本文重点介绍public和private,protected以后再讲,就本文而言private,protected用法一致,没有区别。

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

• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的。

• 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束。

• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

eg:上面日期类再完善

#include <iostream>
using namespace std;
class Date
{
public://行为void Prin(){	;}void Inin(int x,int y,int z)
{_day=x;_year=y;_month=z;
}
private://成员int _day;int _year;int _month;
};
int main()
{Date d1;return 0;
}

当不加private时可以访问到的对象

458bb8c776c443c0bea9edc48110f2b1.png

加private时可以访问到的对象

30b2df46b80646c8987ea11e362acff6.png

当我们有不希望别人修改或者不希望别人直接修改(只能通过我提供的路径修改),就⽤private。⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。

1.3 类域

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

• 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域,那么编译器就把它当成全

局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域,就是知

道它是成员函数,当前域找不到的它时,就会到类域中去查找。

这个往往用在定义和声明分开的时候。

eg:上面日期类获取年函数在类里面声明,在类外面定义

class Date
{
public://行为void Prin(){	;}int Getyear();
private://成员int _day;int _year;int _month;
};int Date::Getyear()
{;
}

2类的实例化

2.1 实例化概念

• ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。

• 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。

• ⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。类就像是设计图,设计图规划了有多少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房⼦,房⼦才能住⼈。类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。

实例化一般有两种方式,第一个是用类作类型,直接创建,此时用" . "来访问,第二个则是创建类指针,然后通过“ -> ”来访问,这两种都可以,我们习惯上用第一种,但一些考试种喜欢用第二种。

eg:

int main()
{Date d1;Date* d2;d1.Prin();d2->Prin();return 0;
}

2.2 对象⼤⼩

类实例化出的每个对象,都有独⽴的数据空间,所以对象中肯定包含成员变量,那么成员函数是否包含呢?⾸先函数被编译后是⼀段指令,对象中没办法存储,这些指令存储在⼀个单独的区域(代码段),那么对象中⾮要存储的话,只能是成员函数的指针。再分析⼀下,对象中是否有存储指针的必要呢,Date实例化d1和d2两个对象,d1和d2都有各⾃独⽴的成员变量_year/_month/_day存储各⾃的数据,但是d1和d2的成员函数Init/Print指针却是⼀样的,存储在对象中就浪费了。如果⽤Date实例化100个对象,那么成员函数指针就重复存储100次,太浪费了。其实函数指针是不需要存储的,函数指针是⼀个地址,调⽤函数被编译成汇编指令[call 地址], 其实编译器在编译链接时,就要找到函数的地址,不是在运⾏时找,只有动态多态是在运⾏时找,就需要存储函数地址。

9601afc719b944aca68d2cb8a579962d.png

对象的大小和C语言中的结构体规则差不多,遵循内存对齐。

采用内存对齐是因为操作系统采集数据时是按照一定的字节数采集的,如果不内存对齐有可能产生数据混杂,又需要分离数据,增加时间成本。故内存对齐本质上是拿空间换时间的做法

eg:

48a81c585ac84c388626cda40b0bba65.png

像这个,假如一次只能拿4个字节的话,就会导致int中有3个字节和char混杂了。

内存对⻬规则

• 第⼀个成员在与结构体偏移量为0的地址处。

• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。

• 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。

• VS中默认的对⻬数为8

• 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。

• 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍

eg:

#include<iostream>
using namespace std;
// 计算⼀下A/B/C实例化的对象是多⼤?
class A
{public :void Print(){cout << _ch << endl;}
private:char _ch;int _i;
};
class B
{public :void Print(){//...}
};
class C
{};
int main()
{A a;B b;C c;cout << sizeof(a) << endl;cout << sizeof(b) << endl;cout << sizeof(c) << endl;return 0;
}

30eab25b169f4c0dabc6a25cce64d020.png

class A:char对齐数为VS对齐数8和本身大小1中的较小值1,即_ch只能从插入在对齐数倍数的行数开始插入,同理int对齐数为vs对齐数8和本身大小4中的较小值4,即_i只能从插入在对齐数倍数的行数开始插入例如,0 4 8 12... 将各变量顺序插入如上图所示,故A对象大小为8字节。

特别的当没有成员变量时,所以这⾥给1字节表⽰对象存在过,纯粹是为了占位标识对象存在,故BC对象大小都是1。

609307c6a67e4bb0be0723f4351d9f64.png

3. this指针

• Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了⼀个隐含的this指针解决这⾥的问题

• 编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。⽐如Date类的Init的真实原型为,

void Init(Date* const this, int x,int y, int z)

• 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值,

e517906ca961487981c16e8d572fd638.png

• C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显⽰使⽤this指针。

this指针有什么作用呢,我们在下一篇中讲解。

4.日期类再完善

下面是通过本文章内容对日期类小应用。

#include <iostream>
using namespace std;
class Date
{
public://行为void Prin() {cout << _year <<' ' << _month <<' ' << _day << endl;}void Inin(int x, int y, int z){this->_day = z;this->_year = x;this->_month = y;}
private://成员int _day;int _year;int _month;
};
int main()
{Date d1;d1.Inin(2023, 11, 1);d1.Prin();return 0;
}

实例化对象调用方法

8c581654a80d4665875df40cdb45f4ea.png

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

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

相关文章

目标追踪DeepSort

一、卡尔曼滤波 你可以在任何对某个动态系统有 “不确定信息” 的地方使用卡尔曼滤波器&#xff0c;并且可以对系统下一步的行为做出 “有根据的猜测”。即使混乱的现实干扰了你所猜测的干净运动&#xff0c;卡尔曼滤波器通常也能很好地确定实际发生了什么。它还可以利用你可能…

Python爬虫:揭开淘宝商品描述的神秘面纱

在这个信息爆炸的时代&#xff0c;我们每天都在和时间赛跑。作为一名Python开发者&#xff0c;你是否曾梦想拥有超能力&#xff0c;能够瞬间揭开淘宝商品描述的神秘面纱&#xff1f;今天&#xff0c;就让我们一起化身为代码界的“福尔摩斯”&#xff0c;使用Python爬虫技术&…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

HTMLCSS:3D旋转动画机器人摄像头

效果演示 创建了一个3D机器人摄像头效果。 HTML <div class"modelViewPort"><div class"eva"><div class"head"><div class"eyeChamber"><div class"eye"></div><div class&quo…

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…

Flink本地模式安装详解

1. 概述 Apache Flink 支持多种安装和运行模式&#xff0c;主要可以分为以下几种&#xff1a; Local&#xff08;本地&#xff09;模式&#xff1a; 这种模式主要用于学习和测试&#xff0c;所有的 Flink 组件都会在同一个 JVM 进程中运行。这种方式非常适合初学者了解 Flink…

Uniapp 实现app自动检测更新/自动更新功能

实现步骤 配置 manifest.json 在 manifest.json 中设置应用的基本信息&#xff0c;包括 versionName 和 versionCode。 一般默认0.0.1&#xff0c;1. 服务器端接口开发 提供一个 API 接口&#xff0c;返回应用的最新版本信息&#xff0c;版本号、下载链接。客户端检测更新 使…

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目&#xff0c;需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE&#xff08;以下简称NCE&#xff09;用于管理项目的整个网络&#xff0c;尤其是光网络。业主要求我们访问该软件提供的对外接口&#xff0c;读取一些网络信息&#xff0c;比如…

docker基础篇(尚硅谷)

学习链接 docker1️⃣基础篇&#xff08;零基小白&#xff09; - 语雀文档 (即本篇) Docker与微服务实战&#xff08;基础篇&#xff09; Docker与微服务实战&#xff08;高级篇&#xff09;- 【上】 Docker与微服务实战&#xff08;高级篇&#xff09;- 【下】 文章目录 学习…

华为通过FTP进行文件操作示例

小知学网络-CSDN博客 目录 通过FTP进行文件操作简介 配置注意事项 组网需求 配置思路 操作步骤 配置文件 组网图形 图1 通过FTP进行文件操作组网图 通过FTP进行文件操作简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 通过FTP进行文件操作简介 配置设备作…

嵌入式开发教程之Linux下IO流

一、文件的概念和类型 文件基础&#xff1a; 概念&#xff1a;一组相关数据的有序集合&#xff0c;文件名、路径。通过文件名指定访问什么文件。 文件类型&#xff1a; 常规文件 r&#xff0c;分为&#xff1a;普通文件&#xff0c;文本文件&#xff08;可见字符&#xff09…

Rust 力扣 - 48. 旋转图像

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们可以将原矩阵进行水平翻转&#xff0c;然后在沿主对角线进行翻转&#xff0c;就能完成原矩阵沿顺时针方向旋转90o的变换 题解代码 impl Solution {pub fn rotate(matrix: &mut Vec<Vec<i32>&…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL&#xff0c;并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮&#xff0c;切换到中文界面 4、点击网页上方的“下载”按钮&#xff0c;然后点击网页…

Sleep_Monitor 2.7.9.2 | 您的个人睡眠助手,帮助您睡得更好

晚上入睡困难吗&#xff1f;Sleep Monitor 是您的睡眠专家&#xff01;这款应用程序可以追踪并记录您的睡眠周期&#xff0c;让您早晨醒来时精神焕发&#xff0c;准备好迎接新的一天。Sleep Monitor 是一个功能丰富的程序&#xff0c;让睡眠变得更加愉快。通过追踪您的打鼾、梦…

基于SSM+微信小程序的汽车维修管理系统(汽车5)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的汽车维修管理系统实现了三个角色&#xff1a;管理员、员工、用户。 1、管理员实现了首页、管理员管理员、员工管理、用户管理、车辆信息管理、配件管理等 2、员工实…

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC

『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 文章目录 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC1. 介绍 二. 参考文献 一. 『Linux学习笔记』如何在 Ubuntu 22.04 上安装和配置 VNC 如何在 Ubuntu 22.04 上安装和配置 VNChttps://hub.docker.c…

jvm学习笔记-轻量级锁内存模型

一&#xff0c;轻量级锁 LockRecord的那个第一个成员变量是拷贝对应锁定了的java对象资源的MarkWord&#xff0c;Lock Record有一个Ptr指针刚开始指向自己&#xff0c;后面这个指针存储在锁定资源的java对象的markword中&#xff0c;后续可以通过java对象的MarkWord快速定位到…

在Windows 10上安装Tesseract并用pytesseract运行OCR任务

诸神缄默不语-个人CSDN博文目录 文章目录 1. Tesseract安装2. pytesseract的安装与使用3. 手动安装其他语种并在pytesseract中调用4. 本文撰写过程中参考的其他网络资料 1. Tesseract安装 Tesseract官方GitHub项目链接&#xff1a;https://github.com/tesseract-ocr/tesseract…

golang的多表联合orm

项目截图 1.数据库连接配置 DbConfigUtil.go package configimport ( "fmt" _ "github.com/go-sql-driver/mysql" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" )var Go…

ONLYOFFICE 8.2版本桌面编辑器评测

目录 ONLYOFFICE 8.2版本桌面编辑器评测一、引言二、ONLYOFFICE 桌面编辑器概述2.1 功能特点2.2 系统支持2.3 数据表&#xff1a;ONLYOFFICE 桌面编辑器功能概述 三、ONLYOFFICE 协作空间3.1 协作功能3.2 部署和集成3.3 数据表&#xff1a;ONLYOFFICE 协作空间功能概述 四、ONL…