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

C++类和对象,初见类

坚持看完,结尾有思维导图总结

这里写目录标题

  • C语言和 C++ 的区别
  • 类的定义
    • 类的初认识
    • 类的内容
    • 访问限定符
    • 类的作用域
  • 类的实例化
  • 类中的 this 指针
  • 总结

C语言和 C++ 的区别

C++ 的祖师爷除了在 C语言的基础上化简了一些复杂操作
更为重要的是,两个语言实现的过程是不一样的
C 语言是一种面向过程的语言,而 C++ 是一种面向对象的语言

如果是洗衣服
C 语言会这样洗
那盆子,放水,放衣服,加洗衣粉,手搓,晾干
而 C++ 会先分析有哪些对象

会有 人 衣服 洗衣机 洗衣粉
通过这些对象的交互完成洗衣服
人只要做把衣服放进洗衣机,加洗衣粉,打开洗衣机就可以
不需要关注衣服是怎么洗的

类的定义

类的初认识

上面我们如果是用 C 语言来写,就要定义一个盆子,然后放水是一个函数
放衣服是一个函数,加洗衣粉是一个函数,手搓衣服是一个函数,晾干是一个函数
然后一步步地走

但是 C++ 不同
他会把人 衣服 洗衣粉 洗衣机分别定义成一个个的类
人有哪些特性,功能,归到人这个类里面
衣服有哪些特性功能,归到衣服这个类中
洗衣机有哪些特性功能,归到洗衣机这个类中

我们很自然地联想到,一个自定义的类型,在 C语言中我们常使用结构体定义
struct 但是 在 C 语言里面,结构体内部并不支持函数

然而在 C++ 中,我们可以在结构体里头写函数了 ,这样于 c语言结构体类似但是不同的东西 我们把他叫做类
类的定义是这样的

class Name
{
//成员函数和成员变量
};// 注意分号

类的内容

类中的内容可以分成两类,一类是 成员变量 , 一类是成员函数
如果我们认识一个人,我们能知道这个人是谁,叫什么名字,是什么性别


class Person
{
//成员函数
public:void personinfo(){cout << _name << ' ' << _age << ' ' << _sex << endl;}
// 成员变量
private:char* _name;int _age;char* _sex;
};

这里的实现是声明和定义放在一起的
有时候,类中声明和函数放在一起的情况,编译器可能会把成员函数看做是内联函数

如果我们想要把声明和实现分离
在这里插入图片描述
在这里插入图片描述

在实现的位置,一个是不要忘记头文件的应用
在引用完头文件后,要说明实现的函数属于哪一个类,这里是类的作用域的问题
声明则放在类里面

访问限定符

有一件奇怪的事情
为什么成员变量前面要加上 private 而 成员函数前面要加上 public
这里就设计到访问限定符的问题

我们都用过洗衣机,也大概都知道怎么用洗衣机
就那几个按钮的事情对吧
我们不会为了使用洗衣机去研究洗衣机的结构

类也是这样,除了设计者
使用的人只要会用成员函数就可以了,并不会去关注成员变量有哪些

public 变式公共的 ,能够为外界调用
private 表示私人,就是不能被类之外的操作访问,但是类内的函数(成员函数)是可以访问的

那我们就能够调用 public 的函数来间接按照特定的方式访问 private 的成员

还有 一个访问限定符 叫 protected 因为是 简略说明 ,所以暂时不介绍

其中需要注意的是
class的默认访问权限为private,struct为public(因为struct要兼容C)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止, 如果后面没有访问限定符,作用域就到 } 即类结束。

而这种通过访问权限,隐藏类的成员变量结构,显示类的访问方式的做法,就是封装

就好像是洗衣机内部被洗衣机外壳包起来,我们看不到内部结构的方式,就是封装
而封装是面向对象 的三大特性之一

类的作用域

之前在初识C++ 中,我们说为了防止多个程序员使用同名变量,同名函数
我们可以用不同的作用域,来圈定哪些变量属于程序员 A ,哪些变量属于程序员 B

而当我们定义一个类的时候,会自动生成一个类的作用域
不同的类是可以使用同名函数和变量的,使用类的作用域能够很好地应对这种情况
因为成员变量已经在类里面了不用再表明属于哪一个类
而当函数声明和实现分离时,在实现函数的时候,必须指明属于哪一个类,防止实现的混淆

类的实例化

前面我们解决的是类的声明的问题
类的声明,就好像把动物分成一个个种类,比如像熊猫,这是一类动物
但是其中的每一只熊猫都有自己的特征,自己的名字等

这种就叫做实例化
在计算机中,我们说类有 成员函数,成员变量,都是类的声明
而在使用中调用的类,才是类的实例化
我们可以简单理解为为类开空间就是类的实例化

既然为类开空间了,那就说明有空间大小
空间大小是如何计算呢?
尤其是一个类中有成员函数,整个类大大小计算更加奇怪了

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Date
{
public:void DateInit(Date& date, int year = 1, int month = 1, int day = 1);
private:int _year;int _month;int _day;
};void Date::DateInit(Date& date,int year,int month,int day)
{date._year = year;date._day = day;date._month = month;
}int main()
{Date d1;d1.DateInit(d1,2023,2,14);cout << sizeof(d1) << endl;return 0;
}

我定义了一个日期类,其中内部成员有年月日
通过计算大小,发现
在这里插入图片描述
计算大小是 12 ,说明 ---- 内部只给内部成员开辟了空间,但是没有给函数开辟空间
那函数的空间开辟到哪里去了呢?

实际上,类的空间开辟,是这样的
事实上,每一个成员虽然不同,但是调用的成员函数传递的参数都是一样的
也就是说,对于类的成员函数来说
每个类只要把成员函数需要的参数传给我就可以了

成员函数是不管你是哪一个成员
我们在观察一下对应的汇编代码
在这里插入图片描述
可以看到调用的是同一个函数
既然编译器都帮你对应的函数调用转换了,和调用一个普通函数差不多
又何必开辟空间储存对应的函数指针甚至是整个函数栈帧呢,答案是没有必要浪费这个空间

但是要注意的是,如果实例化一个空类(一个没有内容的类)
他的空间大小是 1 ,用来占位

类中的 this 指针

在类的成员函数中,我们可以这样写初始化函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;class Date
{
public:void Init(int year,int month,int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2023,2,16);return 0;
}

在调试中我们能够看到 d1 被初始化为 2023 2 16
在这里插入图片描述

但是传参中,我可是没有传递任何与 d1 相关的参数
只是之前的 d1.Init 指定了一下而已
成员函数是怎么样找到 d1 然后将 d1 初始化的呢?

实际上,编译器会自动帮我们传递一个 this 指针 的参数交给成员函数
这个 this 指针始终指向 调用这个成员函数的对象

比如我们 d1.Init 调用 Init 成员函数
编译器会把 this 指针传参
然后对应的成员 变成 this->成员 的解引用
在这里插入图片描述
但是我们不能直接把 this 指针当成一个参数写在函数上面
如果这样写,编译器会传递自己在函数自动传参的 this 指针
但是 用户写的 this 这个形参的坑就没有人填了,导致形参数量过多,出现问题

总结

在这里插入图片描述

希望大家看完,能够有所
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

相关文章:

C++类和对象,初见类

坚持看完&#xff0c;结尾有思维导图总结 这里写目录标题C语言和 C 的区别类的定义类的初认识类的内容访问限定符类的作用域类的实例化类中的 this 指针总结C语言和 C 的区别 C 的祖师爷除了在 C语言的基础上化简了一些复杂操作 更为重要的是&#xff0c;两个语言实现的过程是…...

Redis常用数据结构及应用场景

1.总体结构 Redis中的数据&#xff0c;总体上是键值对&#xff0c;不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型&#xff0c;它是key对应的一个单一值。二进制安全&#xff0c;不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…...

C++虚继承内存布局

C菱形继承内存布局 编译器&#xff1a;Visual Studio 2019 关于如何查看内存布局 B class B { public:B(): _ib(10), _cb(B){cout << "B()" << endl;}B(int ib, char cb): _ib(ib), _cb(cb){cout << "B(int,char)" << endl;}vi…...

IO模型--从BIO、NIO、AIO到内核select、poll、epoll剖析

IO基本概述 IO的分类 IO以不同的维度划分&#xff0c;可以被分为多种类型&#xff1b;从工作层面划分成磁盘IO&#xff08;本地IO&#xff09;和网络IO&#xff1b; 也从工作模式上划分&#xff1a;BIO、NIO、AIO&#xff1b;从工作性质上分为阻塞式IO与非阻塞式IO&#xff1b…...

Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速

从去年开始&#xff0c;Zebec 就开始以多链的形式来拓展自身的流支付生态&#xff0c;一方面向更多的区块链系统拓展自身流支付协议&#xff0c;即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署&#xff0c;且能够在这些EV…...

wpscan常见的使用方法

目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安…...

Tree 底层源码实现(二叉树、递归、迭代)

树&#xff08;Tree&#xff09;是一种非线性数据结构&#xff0c;由一组节点和它们之间的边组成。在树中&#xff0c;每个节点都有零个或多个子节点&#xff0c;除了根节点外&#xff0c;每个节点都有且仅有一个父节点。树可以被用于许多应用程序&#xff0c;如文件系统、XML文…...

家政服务小程序实战教程13-接入客服

小程序在微信里使用&#xff0c;以其无需安装随用随走为特点。但是有个问题是&#xff0c;如果提供商品或者服务的&#xff0c;用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求&#xff0c;就需要我们提供客服接入的功能&#xff0c;用户可以点击客服图标…...

大白话高并发(三)

背景 高并发得第三篇&#xff0c;讲一讲压测吧&#xff0c;因为我的目的是模拟100万人同时来秒杀。 是不是真的要找100万个人 没必要 &#xff0c;你就算100万人掐着表在同一毫秒内把请求请求某一台机器&#xff0c;服务器也不可能在同一时间处理那么多请求&#xff0c;因为…...

vue全家桶(四)前端工程化

vue全家桶&#xff08;四&#xff09;前端工程化1.模块化的相关规范1.1模块化概述1.2模块化的分类A.浏览器端的模块化B.服务器端的模块化C.ES6模块化1.2.1 Node.js中通过bable体验ES6模块化1.2.2 ES6模块化的基本语法1.2.2.1 默认导出与默认导入1.2.2.2 按需导出与按需导入1.2.…...

超螺旋滑模控制(STA)

超螺旋滑模控制(Super Twisting Algorithm, STA) 超螺旋滑模控制又称超扭滑模控制&#xff0c;可以说是二阶系统中最好用的滑模控制方法。 系统模型 对于二阶系统可以建立具有标准柯西形式的微分方程组 {x˙1x2x˙2fg⋅u\begin{cases} \dot x_1 x_2 \\ \dot x_2 f g \cdo…...

NX二次开发编译时dll自动数字签名及拷贝

前言 在UG5.0开始&#xff0c;所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 一、基于C# 开发签名 1、添加资源文件 &#xff08;1&#xff09;项目类库上右键–>属性–>资源–>添加资源右边小三角–>添加现有文件–>切换到UG安装目录下…...

教你如何搭建人事OA-薪资管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建人事OA-薪资管理。1.2、应用场景根据设置薪资基础及考勤和绩效的数据计算得到各个员工工资详情。2、设置方法2.1、表单搭建1&#xff09;新建表单【工资表】&#xff0c;字段设置如下&#xff1b;名称类型名称类型人员资料分…...

ChIP-seq 分析:Mapped 数据可视化(4)

1. Mapped reads 现在我们有了 BAM 文件的索引&#xff0c;我们可以使用 idxstatsBam() 函数检索和绘制映射读取的数量。 mappedReads <- idxstatsBam("SR_Myc_Mel_rep1.bam")TotalMapped <- sum(mappedReads[, "mapped"])ggplot(mappedReads, aes(x…...

Jenkins 基于Kubernetes 弹性构建池

流程&#xff1a;创建Jenkins Agent&#xff1b;获取Jenkins Agent的参数&#xff1b;渲染yaml模板&#xff1b;调用K8s API在固定的NS中创建一个Pod&#xff1b;运行Jenkins pipeline到agent&#xff1b;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…...

经典算法题---链表奇偶重排(好题)双指针系列

我听别人说这世界上有一种鸟是没有脚的&#xff0c;它只能够一直的飞呀飞呀&#xff0c;飞累了就在风里面睡觉&#xff0c;这种鸟一辈子只能下地一次&#xff0c;那一次就是它死亡的时候。——《阿甘正传》这一文章讲解链表的奇偶排序问题&#xff0c;这是一道不难但是挺好的链…...

数据仓库实战

目录1、最佳实战1.1 表的分类1.2 ETL策略1.3 任务调度2、项目实战2.1 项目概述2.2 数据描述2.3 架构设计2.4 环境搭建2.5 项目开发1、最佳实战 1.1 表的分类 维度建模中表的类型&#xff1a;事实表和维度表 事实表又可以分为&#xff1a;事务事实表、周期快照事实表、累积快照…...

GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)

&#x1f604; 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构&#xff1a;1.2、范式&#xff1a;预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式&#xff1a;预…...

ASE12N65SE-ASEMI高压MOS管ASE12N65SE

编辑-Z ASE12N65SE在ITO-220AB封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.68Ω&#xff0c;是一款N沟道高压MOS管。ASE12N65SE的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE…...

centos8防火墙命令配置(开放端口)

查看防火墙状态&#xff1a;&#xff08;root用户&#xff09;firewall-cmd –state启动防火墙&#xff1a;&#xff08;root用户&#xff09;systemctl start firewalld.service查看防火墙开放端口&#xff1a;&#xff08;root用户&#xff09; firewall-cmd --list-ports …...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...