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++类和对象,初见类
坚持看完,结尾有思维导图总结 这里写目录标题C语言和 C 的区别类的定义类的初认识类的内容访问限定符类的作用域类的实例化类中的 this 指针总结C语言和 C 的区别 C 的祖师爷除了在 C语言的基础上化简了一些复杂操作 更为重要的是,两个语言实现的过程是…...
 
Redis常用数据结构及应用场景
1.总体结构 Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。 2.string类型 Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以…...
C++虚继承内存布局
C菱形继承内存布局 编译器: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以不同的维度划分,可以被分为多种类型;从工作层面划分成磁盘IO(本地IO)和网络IO; 也从工作模式上划分:BIO、NIO、AIO;从工作性质上分为阻塞式IO与非阻塞式IO;…...
 
Zebec完成BNB Chain以及Near链上协议部署,多链化进程加速
从去年开始,Zebec 就开始以多链的形式来拓展自身的流支付生态,一方面向更多的区块链系统拓展自身流支付协议,即从Solana上向EVM链上对协议与通证等进行迁移与拓展。目前基本完成了在BNB Chain以及Near上的合约部署,且能够在这些EV…...
 
wpscan常见的使用方法
目录 简单介绍 暴力破解 信息收集 指定用户爆破 命令集合 简单介绍 Wordpress是一个以PHP和MySQL为平台的免费自由开源的博客软件和内容管理系统。 WPScan是Kali Linux默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安…...
Tree 底层源码实现(二叉树、递归、迭代)
树(Tree)是一种非线性数据结构,由一组节点和它们之间的边组成。在树中,每个节点都有零个或多个子节点,除了根节点外,每个节点都有且仅有一个父节点。树可以被用于许多应用程序,如文件系统、XML文…...
 
家政服务小程序实战教程13-接入客服
小程序在微信里使用,以其无需安装随用随走为特点。但是有个问题是,如果提供商品或者服务的,用户如果有问题往往希望平台的运营方给出专业的解答。为了满足这类需求,就需要我们提供客服接入的功能,用户可以点击客服图标…...
 
大白话高并发(三)
背景 高并发得第三篇,讲一讲压测吧,因为我的目的是模拟100万人同时来秒杀。 是不是真的要找100万个人 没必要 ,你就算100万人掐着表在同一毫秒内把请求请求某一台机器,服务器也不可能在同一时间处理那么多请求,因为…...
 
vue全家桶(四)前端工程化
vue全家桶(四)前端工程化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) 超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。 系统模型 对于二阶系统可以建立具有标准柯西形式的微分方程组 {x˙1x2x˙2fg⋅u\begin{cases} \dot x_1 x_2 \\ \dot x_2 f g \cdo…...
 
NX二次开发编译时dll自动数字签名及拷贝
前言 在UG5.0开始,所有基于UG二次开发的DLL都要“签名”后才能被客户端上正版的NX调用。 一、基于C# 开发签名 1、添加资源文件 (1)项目类库上右键–>属性–>资源–>添加资源右边小三角–>添加现有文件–>切换到UG安装目录下…...
 
教你如何搭建人事OA-薪资管理系统,demo可分享
1、简介1.1、案例简介本文将介绍,如何搭建人事OA-薪资管理。1.2、应用场景根据设置薪资基础及考勤和绩效的数据计算得到各个员工工资详情。2、设置方法2.1、表单搭建1)新建表单【工资表】,字段设置如下;名称类型名称类型人员资料分…...
 
ChIP-seq 分析:Mapped 数据可视化(4)
1. Mapped reads 现在我们有了 BAM 文件的索引,我们可以使用 idxstatsBam() 函数检索和绘制映射读取的数量。 mappedReads <- idxstatsBam("SR_Myc_Mel_rep1.bam")TotalMapped <- sum(mappedReads[, "mapped"])ggplot(mappedReads, aes(x…...
 
Jenkins 基于Kubernetes 弹性构建池
流程:创建Jenkins Agent;获取Jenkins Agent的参数;渲染yaml模板;调用K8s API在固定的NS中创建一个Pod;运行Jenkins pipeline到agent;创建Agentimport hudson.model.Node.Mode import hudson.slaves.* impor…...
 
经典算法题---链表奇偶重排(好题)双指针系列
我听别人说这世界上有一种鸟是没有脚的,它只能够一直的飞呀飞呀,飞累了就在风里面睡觉,这种鸟一辈子只能下地一次,那一次就是它死亡的时候。——《阿甘正传》这一文章讲解链表的奇偶排序问题,这是一道不难但是挺好的链…...
 
数据仓库实战
目录1、最佳实战1.1 表的分类1.2 ETL策略1.3 任务调度2、项目实战2.1 项目概述2.2 数据描述2.3 架构设计2.4 环境搭建2.5 项目开发1、最佳实战 1.1 表的分类 维度建模中表的类型:事实表和维度表 事实表又可以分为:事务事实表、周期快照事实表、累积快照…...
 
GPT系列:GPT, GPT-2, GPT-3精简总结 (模型结构+训练范式+实验)
😄 花一个小时快速跟着 人生导师-李沐 过了一遍GPT, GPT-2, GPT-3。下面精简地总结了GPT系列的模型结构训练范式实验。 文章目录1、GPT1.1、模型结构:1.2、范式:预训练 finetune1.3、实验部分:2、GPT-22.1、模型结构2.2、范式:预…...
 
ASE12N65SE-ASEMI高压MOS管ASE12N65SE
编辑-Z ASE12N65SE在ITO-220AB封装里的静态漏极源导通电阻(RDS(ON))为0.68Ω,是一款N沟道高压MOS管。ASE12N65SE的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。ASE…...
centos8防火墙命令配置(开放端口)
查看防火墙状态:(root用户)firewall-cmd –state启动防火墙:(root用户)systemctl start firewalld.service查看防火墙开放端口:(root用户) firewall-cmd --list-ports …...
 
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
 
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
 
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
 
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
 
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
 
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
 
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
